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) {