2012-09-10 37 views
1

我想提出一個bukkit插件,和我使用所謂的MCStats的API,創建圖形類的實例,你添加繪圖儀是這樣的...遍歷HashMap來創建內部功能

mobs.addPlotter(new Metrics.Plotter("Player") { 

    @Override 
     public int getValue() { 
      return 0; 
     } 

}); 

但是我想從一個HashMap和idealy像這樣得到的數值...

for(String mob: mobNames) { 
    mobs.addPlotter(new Metrics.Plotter(mob) { 

     @Override 
      public int getValue() { 
       return Stats.getValue(mob); 
      } 

    }); 
} 

但很明顯,它不能訪問暴徒的變量,如果我將它設置爲最後,它仍然不會能夠改變循環。我該如何解決這個問題?

+3

爲什麼'getValue()'這裏不使用傳遞給繪圖儀構造函數的怪名? – sjr

+3

爲什麼不將循環變量設置爲'final'工作?這樣做會導致它改變每次迭代,但不會*在每次迭代中*。 –

+0

@sjr - 將'mob'傳遞給構造函數不會爲該名稱創建新的作用域; 'getValue'中'mob'的引用是循環變量,而不是構造函數參數。 OP的問題是內部類不能引用局部變量,除非它是'final'。 –

回答

2

可以,事實上,在增強for循環使用final

for(final String mob: mobNames) { 
    mobs.addPlotter(new Metrics.Plotter(mob) { 

     @Override 
      public int getValue() { 
       return Stats.getValue(mob); 
      } 

    }); 
} 
+0

謝謝,我實際上並不知道這一點:我認爲它的字面意思是它不能再被改變 –

+2

@DanSpiteri - [Java語言規範](http://docs.oracle.com/javase/specs/jls /se7/html/jls-14.html#jls-14.14.2)描述了編譯器如何將增強的for循環轉換爲基本的for語句。循環變量作爲變量聲明_inside_是基本的'for'循環體,因此每次通過循環時都會重新聲明它(如果有修飾符,則作爲'final'變量)。 –

0

可以使用final關鍵字的暴民,它仍然在循環中改變。 嘗試下面運行該代碼:

public class Test2 { 

    public static void main(String args[]) { 
     String[] data = new String[] {"1", "2"}; 
     List<MyClass> test = new ArrayList<MyClass>(); 
     for (final String word: data) { 
      test.add(new MyClass() { 
       @Override 
       public void testMethod() { 
        System.out.println(word); 
       } 
      }); 
     } 
     for (MyClass myClass: test) { 
      myClass.testMethod(); 
     } 
    } 

    static class MyClass { 
     public void testMethod() { 

     } 
    } 
} 

的輸出將是 「1」 和 「2」。