如何制作可变物体的防御性副本,该物体包含不变的物体中的可变场?

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的答案可以完成您想要的。如果您有一个一般的可变对象,该对象不提供复制它的机制,并且直到稍后才知道该类型,那么反射方法就是如何实现复制机制。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top