我在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());
}
但在我看来这并不是很好的风格,所以我希望你能告诉我这样做的正确方法是什么!
答案 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()));
}