题
我知道我要你好看不写一个测试自己...但是我很好奇的人的意见,不只是功能,所以......这里去...
我有了一个私有列表类。我想通过公共getMyList()方法来添加到专用列表。
所以... ...将这项工作?
public class ObA{
private List<String> foo;
public List<String> getFoo(){return foo;}
}
public class ObB{
public void dealWithObAFoo(ObA obA){
obA.getFoo().add("hello");
}
}
解决方案
是的,这绝对会工作 - 这通常是一件坏事。 (这是因为你真的返回的引用应用于集合对象,不是集合本身的副本。)
很多时候你想提供真正只读的集合,这通常意味着返回各地收集的只读包装访问。使得返回类型由收集来实现一个只读接口和返回实际的集合引用不提供更多的保护:来电者可以很容易地转换为“真正的”集合类型,然后添加没有任何问题。
其他提示
事实上,不是一个好主意。不要将可变成员发布之外,做一个副本,如果你不能在飞行中提供了一个只读版本...
public class ObA{
private List<String> foo;
public List<String> getFoo(){return Collections.unmodifiableList(foo);}
public void addString(String value) { foo.add(value); }
}
如果你想了解这样的看法,我会删除getFoo()
呼叫并添加add(String msg)
和remove(String msg)
方法(或要公开任何其他功能),以OBA
捐赠访问收集似乎总是在我的经验是坏事 - 这主要是因为他们几乎无法控制,一旦他们离开。我采取的决不让包含它们的类外直接访问收藏的习惯。
这背后的主要理由是,几乎总是存在某种商业逻辑的连接到数据收集 - 例如,验证在添加或也许有一天你需要添加第二个密切相关的集合。
如果您允许访问像你说的是,这将是在未来很难做出这样的修改。
呵呵,也是,我经常发现我最终要储存更多一点的数据与我存储的对象 - 所以我创建了一个新的对象(仅适用于内,里面收集了“集装箱”之称),我把里面该对象将它在集合中之前。
如果你已经把你的收藏锁定了,这是一个简单的重构。试着想象它会在你在哪里,你没有保持锁定的收集工作的一些情况多么困难...
如果你想支持添加和删除功能,美孚,我建议的方法addFoo()和removeFoo()。我最好你可以通过为每个片的功能,你需要一种方法消除的getFoo在在一起。这使它清楚至呼叫者将预制棒列表中的功能。