2015-05-14 68 views
1

这可能是我的代码中一个愚蠢的问题,但是当的mouseClicked在面板上进行将项目从循环条件是一样的ItemDialog的项目参数?匿名监听器内部的循环

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) {} 
}); 
+1

是的。你的'for-each'循环中没有其他'item',所以引用很简单。 调试IDE中的代码,你看到了什么? – CubeJockey

+2

对于downvoters:这不是一个愚蠢的问题。关于匿名内部类别的混淆范围是一个很好的问题,他们如何保证未来的价值仍然是一样的。 Plus循环范围变量。加上Java-8会自动使变量成为'final'。 –

+0

我不明白downvote。有很多问题都是错误的假设导致错误的,例如stackoverflow.com/questions/8327781/(编辑:或简称:我同意先生勺) – Marco13

回答

3

是的简单答案。

但是,就像我在评论中所说的,这里有很多事情要做!

匿名内部类是令人困惑的:类似的头疼JavaScript中的闭包。

他们可以访问自己定义的变量。他们仍然可以在之后的在将来的任意点访问那些相同的变量引用,即使这些变量会超出范围。使这成为可能的规则是这些变量必须被声明为final

这篇文章解释比我能更好的机制:How does java implement inner class closures?

旁白:由于Java 8中,编译器会自动使每个Item item变量final因为它能发现它们在你的匿名inner-使用类。所以他们有效地变成:

for (final Item item: itemsList) {