使用'default'HashMap调用不同的构造函数

时间:2011-04-28 14:08:16

标签: java constructor default-constructor

我在MyClass类上运行了很多测试用例,使用它的默认构造函数:MyClass()。

现在,MyClass的要求发生了变化,用户可以提供一个HashMap来指示一些对。现在,MyClass需要至少有一对,如果其中一个为null,则抛出异常。

我希望创建另一个默认构造函数,以避免重写所有测试方法,如:

public MyClass() {

  HashMap<KeyClass, ValueClass> hashMap = HashMap<KeyClass, ValueClass>();
  hashMap.put(KeyClass.someValue, new ValueClass());
  this(hashMap);

}

现在这不起作用,因为我必须先调用其他构造函数,所以我想写一些方法

private static HashMap<KeyClass, ValueClass> getDefaultHashmap();

并使用它来调用其他构造函数:

public MyClass() {

  this(MyClass.getDefaultHashmap());

}

但在我看来这并不是很好的风格,所以我希望你能告诉我这样做的正确方法是什么!

4 个答案:

答案 0 :(得分:3)

您可以内联HashMap创建:

public MyClass() {
    this(new HashMap<KeyClass, ValueClass>() {{
        put(KeyClass.someValue, new ValueClass());
    }});
}

但是你必须忽略序列号警告才能保持“漂亮”。

答案 1 :(得分:1)

就个人而言,我会在两个构造函数中创建new HashMap(...),而不是尝试将创建包装在新的静态方法中。

答案 2 :(得分:1)

以下是我通常使用的解决方案:

public MyClass {

  private static Map<KeyClass, ValueClass> newMap() {
     Map<KeyClass, ValueClass> result = new HashMap<KeyClass, ValueClass>();
     result.put(KeyClass.someValue, new ValueClass());
     return result; 
  }

  public MyClass() {
     this(newMap());
  }

  public MyClass(Map<KeyClass, ValueClass> m) { ... }
}

我更喜欢它继承HashMap - 类(由@alpian建议) - 看起来更干净,并且也不会产生破坏equals()方法的合同的风险(在此处描述:{{ 3}})

答案 3 :(得分:1)

如果你想避免创建一个新的匿名HashMap子类,并且只需要一对,并且不想创建一个新的静态方法,你可以这样做:

public MyClass() {
    this(new HashMap<KeyClass, ValueClass>(
        Collections.singletonMap(KeyClass.someValue, new ValueClass())));
}

如果你的其他构造函数采用Map并复制它,你可能甚至不需要创建HashMap

public MyClass() {
    this(Collections.singletonMap(KeyClass.someValue, new ValueClass()));
}