【发布时间】:2014-03-18 13:43:02
【问题描述】:
在 Java 中,也可能在其他语言中,例如在 getter 中,您必须决定是要返回对某物的引用还是克隆(副本)。
return myInstance;
仅返回引用非常快,不需要额外的内存,但实例的修改会“写回”原始实例。
return myInstance.clone();
返回一个克隆需要时间,并且该变量的内存加倍,但要保证它的安全。
可以在某物上创建不可变视图:
return MyUtil.immutableView(myInstance);
但有时我想要修改它,只是不想把它写回去。
现在我的想法是,是否有可能(或者已经完成,或者是否有一种编程语言可以做到)创建一个最初是对某事物的引用的对象只要没有修改。一旦第一次修改开始,引用就会自行更新为克隆。
类似这样的:
Class<T> CloneReference
{
T ref;
boolean cloned=false;
public CloneReference(T ref) {this.ref=ref;}
T getForReadOnly()
{
return ref;
}
T getForReadWrite()
{
if(!cloned) ref=ref.clone();
return ref;
}
}
不幸的是,这个解决方案复杂、笨拙且容易破解(调用 getForReadOnly() 然后使用实例更改操作)。是否有可能做得更好,还是 Java 无法做到这一点?
【问题讨论】:
-
但是如果你有一个对象的引用,你不能在需要调用clone()的时候克隆它吗?
-
clone() 只克隆一层深度。它克隆对象中的引用,但不克隆这些引用指向的对象。这些对象仍将与原始对象相同,您在其中修改的任何内容也将在原始对象中显示出来。
-
@prmottajr:是的,但我希望库/类来处理这个问题,而不是信任调用者。