Позвоните в другой конструктор с помощью Hashmap «по умолчанию»

StackOverflow https://stackoverflow.com/questions/5819946

Вопрос

У меня было много тестов, работающих на классе 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()));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top