Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的发布/转义和封装_Java_Encapsulation - Fatal编程技术网

Java中的发布/转义和封装

Java中的发布/转义和封装,java,encapsulation,Java,Encapsulation,我正在阅读《Java并发性练习》一书,其中有一部分我不太理解。我知道这是一本旧书,也许这就是为什么没有提到我的怀疑的原因 在“共享对象”一章中,有一个名为“发布和转义”的部分: 发布对象意味着使其可供其外部代码使用 当前作用域,例如通过将对它的引用存储在其他代码所在的位置 可以找到它,从非私有方法返回它,或将它传递给 方法在另一个类中 发布时发布的对象 不应该被说成是逃跑了 有一个例子: class UnsafeStates { private String[] states = new

我正在阅读《Java并发性练习》一书,其中有一部分我不太理解。我知道这是一本旧书,也许这就是为什么没有提到我的怀疑的原因

在“共享对象”一章中,有一个名为“发布和转义”的部分:

发布对象意味着使其可供其外部代码使用 当前作用域,例如通过将对它的引用存储在其他代码所在的位置 可以找到它,从非私有方法返回它,或将它传递给 方法在另一个类中

发布时发布的对象 不应该被说成是逃跑了

有一个例子:

class UnsafeStates
{
   private String[] states = new String []
   {"AK", "AL" ....};

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

并且被指定为不以这种方式执行“从不”

我突然想到了封装的概念,基本上就是说要做到这一点


我误解了概念或什么?

问题在于这种方法:

public String [] getStates(){return states;}
返回对states数组的引用

即使将状态声明为private,但如果通过getStates方法获取,仍然可以修改states变量:

UnsafeStates us = new UnsafeStates();
String[] copyStates = us.getStates();
copyStates[0] = "You don't know"; // Here the change to `copyStates` also affect the `states` variable since they're both reference to the same array.
通常,对于对象和数组属性,通常会返回该属性的深度副本,以防止修改内部属性

例如:对于阵列:

String[] copied = new String[states.length];
System.arraycopy(states, 0, copied, 0, states.length);
return copied;
有关列表:

return Collections.unmodifiableList(internalList);
对于对象:

return internalObject.clone(); // Require deep clone

在你的回答之后,我正在读这篇文章。因此,在本书中,基本上重要的一点是,您可以在其预期范围之外修改数组对象的内容。非常感谢。