我意识到我会因为不仅仅是自己编写测试而受到抨击......但我对人们的意见感到好奇,而不仅仅是功能,所以......这里...... ...
我有一个有私人名单的班级。我想通过public 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");
}
}
答案 0 :(得分:4)
是的,这绝对有用 - 这通常是件坏事。 (这是因为你真的将引用返回到集合对象,而不是集合本身的副本。)
通常,您希望提供对集合的真正只读访问权限,这通常意味着在集合周围返回只读包装器。使返回类型成为集合实现的只读接口并返回实际的集合引用并不能提供太多保护:调用者可以轻松地转换为“真实”集合类型,然后添加没有任何问题。
答案 1 :(得分:2)
确实,不是一个好主意。不要在外面发布您的可变成员,如果您无法动态提供只读版本,请复制...
public class ObA{
private List<String> foo;
public List<String> getFoo(){return Collections.unmodifiableList(foo);}
public void addString(String value) { foo.add(value); }
}
答案 2 :(得分:1)
如果您想要执行此操作,我会删除getFoo()
调用,并向ObA添加add(String msg)
和remove(String msg)
方法(或您要公开的任何其他功能)
答案 3 :(得分:1)
根据我的经验,访问收藏似乎总是一件坏事 - 主要是因为一旦他们离开,他们几乎无法控制。我已经养成了从不允许直接访问包含它们的类之外的集合的习惯。
这背后的主要原因是几乎总会有某种业务逻辑附加到数据集合上 - 例如,添加验证或者有一天你需要添加第二个密切相关的集合。
如果您允许访问就像您正在谈论的那样,将来很难做出这样的修改。
哦,而且,我经常发现我最终需要存储一些我正在存储的对象的数据 - 所以我创建了一个新对象(仅在容器中包含该容器的内部)和我在将对象放入集合之前将对象置于其中。
如果你保持你的收藏被锁定,这是一个微不足道的重构。试着想象一下,在某些情况下,你没有让收藏锁定的地方有多困难......
答案 4 :(得分:1)
如果你想支持向Foo添加和删除函数,我建议使用addFoo()和removeFoo()方法。理想情况下,您可以通过为所需的每个功能创建一个方法来消除getFoo。这清楚地说明了调用者将在列表上执行的函数。