如何解决 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();
}
});
}
我正在写 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();
}
});
}