【发布时间】:2016-02-26 15:11:11
【问题描述】:
您通常如何在 Java 中使用集合 getter?例如我有两个类。
public class A
{
String s = "1";
A () {}
}
public class B
{
List<A> list;
public B()
{
list = new ArrayList<>();
}
public List<A> getList()
{
return list;
}
}
如果我有这样的吸气剂,我可以这样做:
B elem = new B();
elem.getList().add(new A());
所以它打破了 getter 的想法。
我可以的
public List<A> getList()
{
return new ArrayList<>(list);
}
但是,如果我修改结果的一些元素,原来的元素会被改变。
【问题讨论】:
-
参考 SO Question Immutable vs Unmodifiable collection 可以给你一些想法
-
如果要复制列表及其包含的所有内容,您必须使用深度复制功能,但这不是 Java 通常使用的方式。通过 getter 检索时能够编辑列表是正常的。
-
IMO,请注意这一点。虽然不变性在旨在关心的语言(如
Clojure)中是一个很好的想法,但当您处理集合不变性时,它在 Java 中可能会变得非常昂贵。此外,它可能会导致运行时错误(读取List的开发人员希望能够调用add,如果您通过Collections.unmodifiableList返回不可变视图,这将导致Exception)。我宁愿把它留给最佳实践(您的客户应该知道他不应该在getter上致电add并让他在需要时进行复制)
标签: java collections