Java中的发布/转义和封装
我正在阅读《Java并发性练习》一书,其中有一部分我不太理解。我知道这是一本旧书,也许这就是为什么没有提到我的怀疑的原因 在“共享对象”一章中,有一个名为“发布和转义”的部分: 发布对象意味着使其可供其外部代码使用 当前作用域,例如通过将对它的引用存储在其他代码所在的位置 可以找到它,从非私有方法返回它,或将它传递给 方法在另一个类中 发布时发布的对象 不应该被说成是逃跑了 有一个例子:Java中的发布/转义和封装,java,encapsulation,Java,Encapsulation,我正在阅读《Java并发性练习》一书,其中有一部分我不太理解。我知道这是一本旧书,也许这就是为什么没有提到我的怀疑的原因 在“共享对象”一章中,有一个名为“发布和转义”的部分: 发布对象意味着使其可供其外部代码使用 当前作用域,例如通过将对它的引用存储在其他代码所在的位置 可以找到它,从非私有方法返回它,或将它传递给 方法在另一个类中 发布时发布的对象 不应该被说成是逃跑了 有一个例子: class UnsafeStates { private String[] states = new
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
在你的回答之后,我正在读这篇文章。因此,在本书中,基本上重要的一点是,您可以在其预期范围之外修改数组对象的内容。非常感谢。