2015-09-02 20 views
0

我想初始化一個地圖爲一個類中的零。我這樣做是這樣的:更好的方式來初始化在Java構造函數中的地圖

public class A{ 
    private final Map<String,Integer> myMap; 

    public A(){ 

     this.myMap = new HashMap<String,Integer>() { 
      { 
       put("a",0); 
       put("b",0); 
      } 
     }; 
    } 
} 

我的問題:這是一個很好的實施?這有什麼不對嗎?或者有沒有更好的方法來實現這一點?

+1

你怎麼樣'put' a和b它,你初始化後。 –

+0

同意@Rod_Algonquin。在你的情況下,這是最簡單的。 – Andreas

+0

你的意思是在構造函數myMap.put(「a」,0)和myMap(「b」,0)?是不一樣的?還是我錯過了什麼? – Deeps

回答

1

什麼Rod_Algonquin的意思是:

public class A { 
    private final Map<String,Integer> myMap; 

    public A() { 

     this.myMap = new HashMap<String,Integer>(); 
     this.myMap.put("a",0); 
     this.myMap.put("b",0); 
    } 
} 

跟進Luiggi門多薩的評論,因爲Map聲明final,則可能意味着該地圖是不可修改的,但final確實保證。這將:

public class A { 
    private final Map<String,Integer> myMap; 

    public A() { 
     Map<String,Integer> map = new HashMap<String,Integer>(); 
     map.put("a",0); 
     map.put("b",0); 
     this.myMap = Collections.unmodifiableMap(map); 
    } 
} 
+0

謝謝你的回答。 @MickMnemonic也與此類似。 – Deeps

+0

我不明白這個答案是如何解決「這是一個好的實現嗎?這有什麼問題嗎?」問題的一部分。此外,只有零點的不可修改的地圖聽起來毫無用處;我會假設OP想要用零初始化地圖,然後改變一些值。 –

1

一種更好的方式是簡單地把價值在你初始化地圖後:

myMap = new HashMap<>(); 
myMap.put("a",0); 
myMap.put("b",0); 

你的當前版本正在做的是,它的使用實例初始化塊(又名double brace initialization),在後臺創建一個不必要的匿名類。這裏沒有真正的好處。相反,它可能會導致一個小的performance hit

相關問題