为包含地图的类实施/提供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); }
为什么这种方法更好?
答案 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);
免责声明:我没有编译并测试这个答案;)