3

不変オブジェクトに可変フィールドを含む可変オブジェクトの防御コピーを作成するにはどうすればよいですか?

class ImmutableObject {

  private final MutableObject immutable_field;

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

class MutableObject {

  public int mutable_field;
}
  • MutableObjectには、フィールドを設定できるコンストラクターがありません。
  • MutableObjectの現在の状態は、Immutable Objectにキャプチャされ、変更されないようにする必要があります。
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 に答える