具有地图的类的吸气剂/制定者

时间:2011-08-12 03:40:59

标签: java interface encapsulation getter-setter

为包含地图的类实施/提供getter / 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); }

为什么这种方法更好?

4 个答案:

答案 0 :(得分:10)

两者都有它们的用途。 类暴露的方法应该具有适当的抽象级别。例如,如果类是由Map<String, Dog>支持的狗的注册表,那么它可以提供如下方法:

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

如果它是一个允许客户在一次调用中指定整个规则集的规则引擎,那么它可能会暴露以下方法:

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

答案 1 :(得分:3)

总的来说,我会说尽量不要返回地图。有一个方法,获取键并返回值。拍摄地图是可以的,只要你复制它,但是一个获取键/值并将其放入地图的方法将是我的偏好。

如果您必须返回地图,则应返回只读版本或其副本。 set方法也应该复制地图。

允许调用者在类不​​知道的情况下改变类中的数据是一个坏主意,传递或保留可变数据是一个坏主意。

答案 2 :(得分:1)

这完全取决于您的要求。在大多数情况下,这可能就足够了。 您甚至可能没有返回地图的getter方法。如果你使用我的插件,它可能会帮助你创建这些方法:http://fast-code.sourceforge.net/documentation.htm#create-list-map因为eclipse不会帮助你创建add方法。

答案 3 :(得分:-5)

我只想提供一个。有点像...

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

当你想使用它时

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

免责声明:我没有编译并测试这个答案;)

相关问题