3

How do I make defensive copies of a Mutable Object which contains a mutable field in an Immutable Object?

class ImmutableObject {

  private final MutableObject immutable_field;

  ImmutableObject(MutableObject y) {
    this.immutable_field = y;
  }
}

class MutableObject {

  public int mutable_field;
}
  • The MutableObject does not have a constructor that lets me set the field.
  • The MutableObject's current state should be captured in the Immutable Object and never changed.
4

2 回答 2

7

你需要做的是在

  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

于 2010-06-02T03:35:55.667 回答
4

好吧,假设对可变对象类的声明没有什么可做的,可以利用反射(Class .newIntance ()Class .getFields ( ))来创建一个新对象并复制字段值。您也可以通过这种方式实现深度复制。如果该类支持序列化,那么另一种骇人听闻的方法是序列化对象,然后保存反序列化的副本。但是,如果可以修复可变对象的设计,那将是更好的方法。

编辑
对于您给出的特定示例,Romain 的答案可以满足您的要求。如果您有一个通用的可变对象,它不提供复制它的机制并且其类型可能直到稍后才知道,那么反射方法就是实现复制机制的方式。

于 2010-06-02T03:37:26.840 回答