我们如何编写get方法,以便私有字段不会超出其预期范围?

时间:2017-10-13 22:24:35

标签: java multithreading

来自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数组不会超出其预期范围?

关于转义的引用与多线程和同步没有直接关系是否正确?

感谢。

2 个答案:

答案 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);
  }
}