2011-08-12 36 views
11

为包含地图的类实现/提供获取者/设置者的最佳做法是什么?具有地图的类的获取者/设置者

最常见的实现我看到的是:

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

我会尽可能地使用第二个选项,但是如果你必须公开javabean getters/setters,你有时别无选择。 – sMoZely

+7

完全取决于地图所代表的任何内容(因此,功能要求)。这通常要记录在班级和/或方法上。这没有真正的答案。 – BalusC

回答

9

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

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

如果说,一个规则引擎,允许客户指定的整个规则的一个调用设置,然后它可能会暴露如下方法:

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

我只想提供一个。喜欢的东西...

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

,当你想使用它,然后

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

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

3

一般来说,我会说试试根本不返回地图。有一个方法需要键并返回值。只要您复制地图,拍摄地图就可以了,但采用该键/值并将其放入地图的方法将成为我的首选。

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

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