2012-06-12 2 views
0

5 개의 버튼이 있으며 아래 코드 에서처럼 초기화 작업을 수행하기 위해 반복해야합니다. 그러나, Java는 내가 ScreenFactory.produce() 함수에 전달하는 것을 막는다. 왜냐하면 내가 읽었던 클로저 문제로 인해 최종 함수가 아니기 때문이다. 그 이후로는 루프의 증가를 막을 수 없으므로 최종으로 만들 수 없습니다. 해결 방안은 무엇인가?java closure 해결 방법

for(int i = 0; i < 5; ++i) { 
      levelButtons[i].setAction(ActionType.GENERAL_ACTION, new GameAction() { 

       @Override 
       public void execute(int screenID) { 
        Game.instance.changeScreen(ScreenFactory.produce(ScreenFactory.GAME_SCREEN, i)); 
       } 
      }); 

      TouchHandler.instance.register(levelButtons[i]); 
     } 
+1

간단한 해결 방법은 당신의 폐쇄 내부 최종 변수를 생성하고 그것을'의 값을 할당하는 것은 –

+0

@HunterMcMillen을 i' : 게시물을 내가 답변으로 t ... –

+0

나는 어떻게 그것을 나에게 할당하겠습니까? 동일한 문제 : 나는 최종적이 아닙니다 – wirate

답변

1

produce() 호출에 tmp를 전달할 수 당신 폐쇄의 내부와 것은 그것을 i의 값을 할당합니다

for(int i = 0; i < 5; ++i) 
{ 
    final int finalI = i; 
    levelButtons[i].setAction(ActionType.GENERAL_ACTION, new GameAction() 
    { 
     @Override 
     public void execute(int screenID) 
     { 
     Game.instance.changeScreen(ScreenFactory.produce(ScreenFactory.GAME_SCREEN, finalI)); 
     } 
    }); 
    TouchHandler.instance.register(levelButtons[i]); 
} 
+0

나는 여전히 execute()에서 final이 아니며 사용할 수 없다. – wirate

+0

사실,이 예제에서는 finalI이어야합니다. – Digitalis

+0

@wirate 죄송합니다. 잘못된 위치에 넣으십시오. –

0

i를 다른 변수에로드 한 후 ScreenFactory로 전달하십시오.

2

당신은 당신이 final을 표시 루프 내부 (예를 들어 tmp) 임시 변수를 만들 i의 값을 초기화하고 간단한 해결 방법은 최종 변수를 생성하는 것입니다