Позвоните в другой конструктор с помощью Hashmap «по умолчанию»
-
26-10-2019 - |
Вопрос
У меня было много тестов, работающих на классе 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());
}
Но это казалось мне не очень хорошим стилем, поэтому я надеялся, что вы можете сказать мне, что такое правильное способ сделать что -то подобное!
Решение
Вы могли бы встроить создание HashMap:
public MyClass() {
this(new HashMap<KeyClass, ValueClass>() {{
put(KeyClass.someValue, new ValueClass());
}});
}
Но вам придется игнорировать предупреждение о серийном идентификаторе, чтобы сохранить его «симпатичным».
Другие советы
Лично я бы пошел с созданием new HashMap(...)
в обоих конструкторах, и не пытаться обернуть творение новым статическим методом.
Вот решение, которое я обычно использую:
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)
Если вы хотите избежать создания нового анонимного подкласса HashMap, и вам нужна только одна пара, и не хотите создавать новый статический метод, вы можете сделать это:
public MyClass() {
this(new HashMap<KeyClass, ValueClass>(
Collections.singletonMap(KeyClass.someValue, new ValueClass())));
}
Если ваш другой конструктор берет карту и копирует ее, вам, возможно, даже не понадобится коэффициент хэшмапа
public MyClass() {
this(Collections.singletonMap(KeyClass.someValue, new ValueClass()));
}