如何制作对象的防御副本?
-
23-10-2019 - |
题
如何制作可变物体的防御性副本,该物体包含不变的物体中的可变场?
class ImmutableObject {
private final MutableObject immutable_field;
ImmutableObject(MutableObject y) {
this.immutable_field = y;
}
}
class MutableObject {
public int mutable_field;
}
- MutableObject没有使我设置字段的构造函数。
- 可突变对象的当前状态应在不变的物体中捕获,并且永远不会改变。
解决方案
您需要做的是
MutableObject return_immutable_field() {
return immutable_field;
}
改成:
MutableObject return_immutable_field() {
MutableObject tmp = new MutableObject();
tmp.mutable_field = immutable_field.mutable_field;
return tmp;
}
有关解释,请参阅 http://www.javapractices.com/topic/topicaction.do?id=15
其他提示
好吧,假设对可变对象类的声明没有什么可做的,那么人们可以利用反思(班级.newintance() 和 班级.getfields())创建一个新对象并复制字段值。您也可以以这种方式实施深层复制。如果类支持序列化,则另一种hackish方法是序列化对象,然后保存一个供应副本。但是,如果可以修复可变物体的设计,那将是一种更好的方法。
编辑
对于您给出的特定示例,Romain的答案可以完成您想要的。如果您有一个一般的可变对象,该对象不提供复制它的机制,并且直到稍后才知道该类型,那么反射方法就是如何实现复制机制。
不隶属于 StackOverflow