Java 如何编写get方法,使私有字段不';你不能逃脱他们的预期范围吗?

Java 如何编写get方法,使私有字段不';你不能逃脱他们的预期范围吗?,java,multithreading,Java,Multithreading,从Java并发的实践看 发布一个对象可能会间接发布其他对象。如果你加一个 发布的KnownsCrets集的秘密,您也发布了 机密,因为任何代码都可以迭代集合并获取对的引用 新的秘密。类似地,从非私有对象返回引用 方法还发布返回的对象。清单3中的unsastes。 6发布了假定为私有的州缩写数组 class UnsafeStates { private String[] states = new String[] { "AK", "AL" ...

从Java并发的实践看

发布一个对象可能会间接发布其他对象。如果你加一个 发布的KnownsCrets集的秘密,您也发布了 机密,因为任何代码都可以迭代集合并获取对的引用 新的秘密。类似地,从非私有对象返回引用 方法还发布返回的对象。清单3中的unsastes。 6发布了假定为私有的州缩写数组

class UnsafeStates {    
    private String[] states = new String[] {        
        "AK", "AL" ...        
    };    
    public String[] getStates() { return states; }    
}
以这种方式发布状态是有问题的,因为任何调用方都可以 修改其内容。在本例中,states数组已脱离其 预期的范围,因为本来应该是私有的国家 有效地公开了

在本例中,编写
getStates
方法的正确方法是什么,这样states数组就不会超出其预期范围

关于escape的引用与多线程和同步没有直接关系,这对吗


谢谢。

您可以使用Java的数组和集合。 创建只读包装

return Collections.unmodifiableList(Arrays.asList(states));
注意:不要担心字符串会被修改,它们是不可变的。

classsafestates{
class SafeStates {

  private List<String> states;

  public List<String> getStates() {
    return states;
  }

  public void setStates(List<String> states) {
    this.states = Collections.unmodifiableList(states);
  }
}
私人名单国家; 公共列表getStates(){ 返回状态; } 公共无效集合状态(列表状态){ this.states=Collections.unmodifiableList(states); } }
此类不可信。太容易操纵
状态
,而没有安全状态能够阻止;modifies.modification将不可能:UnsupportedOperationException将被发送请阅读:您是否阅读了链接的Java文档?你知道“视图”是什么意思吗?发布的示例认为没有人会或能够修改传递给
setStates
的列表,这显然是错误的。谢谢。我文章中的问题是否只适用于引用类型而不适用于值类型?是的,只是不要忘记基元值类型的数组也是引用类型。