for 循环中的匿名监听器
Anonymous Listener inside for loop
这可能是一个愚蠢的问题,但在我的代码中,当在面板上执行 mouseClicked 时,循环条件中的 item 将是同ItemDialog?
的item参数
for (Item item: itemsList) {
JPanel panel = new ItemPanel(item);
panel.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent arg0) {
new ItemDialog(item);
}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
});
简单的答案是肯定的。
但是,正如我在评论中所说,这里发生了很多事情!
匿名内部 classes 令人困惑:与 Javascript 中的闭包类似的头痛。
他们可以访问在他们之外定义的变量。他们可以仍然在未来的任意点访问那些相同的变量引用,即使变量在其他情况下超出范围。使这成为可能的规则是这些变量必须声明为 final
.
这个 post 比我更好地解释了机制:How does java implement inner class closures?
旁白:自 Java 8 起,编译器 自动 使每个 Item item
变量 final
因为它发现它们正在用在你的匿名内心-class。所以他们实际上变成了:
for (final Item item: itemsList) {
这可能是一个愚蠢的问题,但在我的代码中,当在面板上执行 mouseClicked 时,循环条件中的 item 将是同ItemDialog?
的item参数for (Item item: itemsList) {
JPanel panel = new ItemPanel(item);
panel.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent arg0) {
new ItemDialog(item);
}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
});
简单的答案是肯定的。
但是,正如我在评论中所说,这里发生了很多事情!
匿名内部 classes 令人困惑:与 Javascript 中的闭包类似的头痛。
他们可以访问在他们之外定义的变量。他们可以仍然在未来的任意点访问那些相同的变量引用,即使变量在其他情况下超出范围。使这成为可能的规则是这些变量必须声明为 final
.
这个 post 比我更好地解释了机制:How does java implement inner class closures?
旁白:自 Java 8 起,编译器 自动 使每个 Item item
变量 final
因为它发现它们正在用在你的匿名内心-class。所以他们实际上变成了:
for (final Item item: itemsList) {