2016-10-27 4 views
-2

final으로 설정되어 있지 않으면 내에서 변수 i에 액세스 할 수 없습니다. 그러나 final으로 설정하면 i++이 오류가됩니다. 내 인라인 함수 내에서 i 변수에 액세스 할 수 없다면 막혔습니다. 이것이 가능한가?익명 클래스 내에서 루프 변수에 액세스

for (int i = 0; i < level.myItems.size(); i++) { 
    itemsInInventory[i].setButtonListener(new UIButtonListener() { 
     public void pressed(UIButton button, Sprites sprite) { 
      itemsInInventory[i].performAction();; 
     } 
    }); 
} 
+0

이는 인라인 함수가 아니며 익명입니다. – chrylis

+0

'i'를 클래스 내 전역 변수로 만듭니다. 그렇다면 최종화 할 필요가 없으며'public void pressed' 내에서 액세스 할 수도 있습니다. –

답변

1

문제는 변수의 수명이 for 루프에 연결되지만 만들고있는 객체가 영원히 살 수 있다는 것입니다. 이런 식으로하기 위해, 변수는 final이어야하므로 컴파일러는 익명 클래스 내부에 숨겨진 복사본을 만들 수 있음을 알고 있습니다. 당신은 이것을 할 수 있습니다 :

for(int i = 0; i < foo; i++) { 
    final int index = i; 
    ... anonymous class using "index"... 
} 

자바 8은 조금 더 간단하게 만들지 만 Android N 이상에서만 사용할 수 있습니다.

+0

'final int index = i;' –

+0

@ElliottFrisch 고맙습니다. 너무 멋져요. – chrylis

4

당신은 루프 내부에 final 지역 변수를 선언 할 수있다,

for(int i = 0; i < level.myItems.size(); i++){ 
    final int j = i; 
    itemsInInventory[i].setButtonListener(new UIButtonListener(){ 
     public void pressed(UIButton button, Sprites sprite){ 
      itemsInInventory[j].performAction(); 
     } 
    }); 
} 

또는 더 나은 당신은 단지 버튼을하지 i 필요하기 때문에 (

for(int i = 0; i < level.myItems.size(); i++){ 
    final UIButton btn = itemsInInventory[i]; 
    btn.setButtonListener(new UIButtonListener(){ 
     public void pressed(UIButton button, Sprites sprite){ 
      btn.performAction(); 
     } 
    }); 
} 

또는 더 나은을 아마도 이후 pressed의 첫 번째 인수는 버튼 자체입니다.

for(int i = 0; i < level.myItems.size(); i++){ 
    itemsInInventory[i].setButtonListener(new UIButtonListener(){ 
     public void pressed(UIButton button, Sprites sprite){ 
      button.performAction(); 
     } 
    }); 
} 

마지막 버전에서는 각 버튼마다 별도의 UIButtonListener이 필요하지 않습니다. 모든 리스너가 동일한 리스너를 갖도록 설정하면 청취자가 해당 버튼에 자동으로 디스패치합니다.

UIButtonListener listener = new UIButtonListener(){ 
    public void pressed(UIButton button, Sprites sprite){ 
     button.performAction(); 
    } 
}; 
for(int i = 0; i < level.myItems.size(); i++){ 
    itemsInInventory[i].setButtonListener(listener); 
} 
+0

나는 당신이 'final int j = i;'를 의미한다고 생각한다. –

+0

오, 이런! 엄청 고마워! 왜 내가 그걸 알아낼 수 있는지 몰라! –

+0

@ElliottFrisch - 그게 바로 제가 의미했던 것입니다. 감사! –

관련 문제