来自Java Concurrency in Practice
发布一个对象可能会间接发布其他对象。如果你添加一个 已发布的已知秘密集的秘密,您也已发布 秘密,因为任何代码都可以迭代Set并获得引用 新秘密。同样,从非私有返回引用 方法还发布返回的对象。清单3中的UnsafeStates。 6发布了所谓的私有状态缩写。
class UnsafeStates { private String[] states = new String[] { "AK", "AL" ... }; public String[] getStates() { return states; } }
以这种方式发布状态是有问题的,因为任何调用者都可以 修改其内容。在这种情况下,states数组已经逃脱了它 预期的范围,因为本来应该是私人国家的 有效地公开。
在示例中,编写getStates
方法的正确方法是什么,以便states数组不会超出其预期范围?
关于转义的引用与多线程和同步没有直接关系是否正确?
感谢。
答案 0 :(得分:1)
您可以使用Java的数组和集合。 创建一个只读包装器。
return Collections.unmodifiableList(Arrays.asList(states));
注意:不要担心字符串会被修改,它们是不可变的。
答案 1 :(得分:-2)
class SafeStates {
private List<String> states;
public List<String> getStates() {
return states;
}
public void setStates(List<String> states) {
this.states = Collections.unmodifiableList(states);
}
}