2009-05-21 101 views
0

我意识到我会因为不仅仅是自己写一个测试而感到愤怒...但是我很好奇人们的观点,而不仅仅是功能,所以...这里去...我可以通过getter直接添加到私人列表吗?

我有一个拥有私人清单的班级。我想通过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"); 

    } 
} 

回答

4

是的,这绝对有效 - 这通常是一件坏事。 (这是因为你真的返回一个参考的集合对象,不是集合本身的副本。)

很多时候你想提供真正只读的集合,这通常意味着访问回国该集合是一个只读包装。使返回类型成为由集合实现的只读接口并返回实际的集合引用不会提供太多保护:调用方可以轻松地转换为“真实”集合类型,然后无任何问题地添加。

+0

感谢乔恩。在我的场景中,ObA是一个DTO,我通过一个服务类将其添加到其成员之一中...假设我想尽可能保持DTO尽可能没有行为,那么您会建议什么是首选方法(也就是说,我我喜欢基本上是一个虚拟的数据持有者,没有业务逻辑)。 – 2009-05-21 21:31:40

+0

嗯...我的意思是我想*它是...我个人恐怕没有办法成为一个虚拟数据持有者:) – 2009-05-21 21:32:31

+0

如果它*真的*意味着是一个“哑巴”类,并且它的所有客户都会*知道*这个集合很可能是由其他呼叫者修改,那么可以继续使用它。我会非常明确地记录这些 - 如下所示:“该属性返回对后备集合的直接引用:通过此引用所做的任何更改都会被其他调用者看到。” – 2009-05-21 21:34:19

2

事实上,不是一个好主意。不要将可变成员发布之外,做一个副本,如果你不能提供一个只读的飞行版本...

public class ObA{ 
    private List<String> foo; 
    public List<String> getFoo(){return Collections.unmodifiableList(foo);} 
    public void addString(String value) { foo.add(value); } 
} 
1

如果您想了解这样的看法,我会删除getFoo()呼叫,添加一个add(String msg)remove(String msg)方法(或任何其他功能,你想暴露)到ObA

1

给我的经验似乎总是一件坏事 - 主要是因为他们几乎不可能控制一旦他们出去。我养成了从不允许直接访问包含它们的课外集合的习惯。

这背后的主要原因是,几乎总是有某种业务逻辑附加到数据集合 - 例如,验证添加或可能某天您需要添加第二个密切相关的集合。

如果允许访问像你说的是,这将是非常困难的,将来做这样的修改。

哦,另外,我经常发现我最终要存储与对象多一点的数据我存储 - 所以我创建一个新的对象(仅适用于内,里面收集了“集装箱”之称)和在把它放入集合之前,我把它放在里面。

如果你已经把你的收藏锁定了,这是一个简单的重构。试着想象它会在你在哪里,你没有保持锁定的收集工作的一些情况多么困难...

1

如果你想支持添加和删除功能,美孚,我建议的方法addFoo()和removeFoo()。理想情况下,您可以通过为您需要的每项功能创建方法来消除getFoo。这就清楚了调用者将在列表中执行的功能。

相关问题