1

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

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

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

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

4 回答 4

3

您可以内联 HashMap 创建:

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

但是您必须忽略序列号警告以使其保持“漂亮”。

于 2011-04-28T14:12:06.430 回答
1

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

于 2011-04-28T14:12:39.833 回答
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-class(如@alpian 所建议的那样) - 看起来更干净,并且也不会产生违反 equals() 方法合同的风险(在此处描述:http: //c2.com/cgi/ wiki?DoubleBraceInitialization )

于 2011-04-28T14:31:43.690 回答
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()));
}
于 2011-04-28T17:57:02.370 回答