java闭包解决方法

时间:2012-06-12 15:24:05

标签: java

我有5个按钮,我需要迭代它们来执行一些初始化操作,如下面的代码所示。但是,Java阻止我将i传递给函数ScreenFactory.produce(),因为它不是最终的,因为我读到了一些关闭问题。我不能把它作为最终,因为它会阻止循环的增量。解决方案是什么?

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]);
        }

3 个答案:

答案 0 :(得分:2)

您可以在标记tmp的循环中创建一个临时变量(例如final),使用i的值对其进行初始化,并将tmp传递给{ {1}}致电

答案 1 :(得分:1)

一个简单的解决方法是在闭包内创建一个final变量,并为其赋值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]);
}

答案 2 :(得分:0)

在将i传递给ScreenFactory之前将其加载到另一个变量中。