2015-05-14 109 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) {