如何解决 for 循环中的局部引用变量?

How do I solve local referenced variables inside a for loop?

我正在写 Swing application and trying to make a menu where each menu item has its own action:

这是我想解决这个问题的方法:

private void createGameLevelMenuItems(JMenu menu){
    for (int i = 0; i<10; i++) {
        JMenuItem item = new JMenuItem(new AbstractAction("Level-" + i) {
            @Override
            public void actionPerformed(ActionEvent e) {
                game.loadGame(i);
                board.refresh();
                pack();
            }
        });
        menu.add(item);
    }
}

但是,我不能使用 loadGame(i),因为它说 i 必须是最终的。我明白其中的原因,但我不知道如何解决它。

在我上面的评论中添加一个例子。您可以创建一个 class 实现 AbstractAction,将 i 存储在实例变量中并通过构造函数提供它:

private void createGameLevelMenuItems(JMenu menu){
    for (int i = 0; i<10; i++) {
        JMenuItem item = new JMenuItem(new LoadAction(i));
        menu.add(item);
    }
}

private class LoadAction extends AbstractAction {
    private int i;

    public LoadAction(int i) {
        super("Level-" + i);
        this.i = i;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        game.loadGame(i);
        board.refresh();
        pack();
    }
};

这假设游戏和棋盘是封装 class 中的最终变量,但由于您只是 i 有问题,我想情况就是这样。

快速技巧:在循环的每次迭代中定义一个最终变量,该变量采用 i 的(非最终)值并使用它:

private void createGameLevelMenuItems(JMenu menu){

  for (int i = 0; i<10; i++) {
    final int j = i;   // <--- this line do the thing
    JMenuItem item = new JMenuItem(new AbstractAction("Level-" + j) {
        @Override
        public void actionPerformed(ActionEvent e) {
            game.loadGame(j);
            board.refresh();
            pack();
        }
    });
    menu.add(item);
  }
}

是的,函数内的局部变量必须是最终的。当我遇到这个问题时,我只是在 for 循环中定义了一个虚拟变量:

for (int i=0;i<10;i++) {
    int useI = i;
    JMenuItem item = new JMenuItem(new AbstractAction("Level-" + i) {
        @Override
        public void actionPerformed(ActionEvent e) {
            game.loadGame(useI);
            board.refresh();
            pack();
        }
    });
}