Геттеры/сеттеры класса, имеющие карту

Какова наилучшая практика в реализации/предоставлении getters/seters для класса, содержащего карту?

Наиболее распространенная реализация, которую я вижу, это:

public class MyClass {

  private Map<String, String> myMap;
  public getMyMap() { /* Return an unmodifiable map */ }
  public setMyMap(Map<String, String> myMap) { ... }
}

Или было бы лучше предоставить интерфейс, например:

public getMyMap() { /* Return a modifiable map */ }
public addToMap(String key, String value) { myMap.put(key, value); }

И почему этот метод лучше?

Ответ 1

Оба имеют свои возможности. Методы, открытые классом, должны иметь надлежащий уровень абстракции. Например, если класс является реестром собак, поддерживаемых Map<String, Dog>, тогда он может предоставлять такие методы, как:

void addDog(String name, Dog dog);
Dog findByName(String name);

Если он говорит механизм правил, который позволяет клиентам указывать все правило, установленное в одном вызове, тогда он может выставлять такие методы, как:

void setRules(Map<String, Rule> rules);
Map<String, Rule> getRules();

Ответ 2

В общем, я бы сказал, попробуйте не возвращать карту вообще. Имейте метод, который берет ключ и возвращает значение. Взятие карты в порядке, если вы ее скопируете, но метод, который принимает ключ/значение и помещает его в карту, будет моим предпочтением.

Если вы должны вернуть карту, вы должны вернуть версию только для чтения или ее копию. Метод набора также должен скопировать карту.

Плохая идея разрешить вызывающим пользователям мутировать данные внутри класса без знания класса, передачи или хранения измененных данных. Это плохая идея.

Ответ 3

Это полностью зависит от ваших требований. Этого может быть достаточно в большинстве случаев. Возможно, у вас даже нет метода получения, который возвращает карту. Если вы используете мой плагин, это может помочь вам создать эти методы: http://fast-code.sourceforge.net/documentation.htm#create-list-map, поскольку eclipse не поможет вам создать метод добавления.

Ответ 4

Я бы просто предложил один. Что-то вроде...

public Map<String,String> getMyMap()
{
   return myMap;
}

и если вы хотите его использовать,

myClass.getMyMap().put(key,value);

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я не скомпилировал это и не протестировал этот ответ;)