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

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

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

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

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


person jasonline    schedule 12.08.2011    source источник
comment
Я бы всегда старался использовать второй вариант, где это возможно, но там, где вам нужно выставить геттеры/сеттеры javabean, у вас иногда нет выбора.   -  person sMoZely    schedule 12.08.2011
comment
Зависит исключительно от того, что представляет карта (таким образом, от функциональных требований). Обычно это должно быть задокументировано в классе и/или методах. На это нет реального ответа.   -  person BalusC    schedule 12.08.2011


Ответы (4)


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

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

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

void setRules(Map<String, Rule> rules);
Map<String, Rule> getRules();
person oksayt    schedule 12.08.2011

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

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

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

person TofuBeer    schedule 12.08.2011

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

person fastcodejava    schedule 15.08.2011

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

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

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

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

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

person Rob Goodwin    schedule 12.08.2011