Получатели / установщики класса, имеющие карту - PullRequest
11 голосов
/ 12 августа 2011

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

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

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); }

И почему такой метод лучше?

Ответы [ 4 ]

10 голосов
/ 12 августа 2011

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

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

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

void setRules(Map<String, Rule> rules);
Map<String, Rule> getRules();
3 голосов
/ 12 августа 2011

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

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

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

1 голос
/ 15 августа 2011

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

0 голосов
/ 12 августа 2011

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

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

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

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

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

...