2015-09-02 18 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

相关问题