Getters/setter на клас, който има карта

Каква е най-добрата практика при прилагане/осигуряване на гетери/сетери за клас, съдържащ карта?

Най-често срещаната реализация, която виждам, е:

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 getters/setter, понякога нямате избор.   -  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

Като цяло бих казал, че опитайте изобщо да не връщате картата. Имате метод, който взема ключа и връща стойността. Вземането на карта е добре, стига да я копирате, но метод, който взема ключа/стойността и го поставя в картата, би бил моето предпочитание.

Ако трябва да върнете картата, трябва да върнете версия само за четене или копие от нея. Зададеният метод също трябва да копира картата.

Лоша идея е да се позволи на повикващите да променят данните вътре в клас, без класът да знае, предаването или задържането на променливи данни е лоша идея.

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