Как сделать защитную копию объекта? - PullRequest
3 голосов
/ 02 июня 2010

Как мне сделать защитные копии изменяемого объекта, который содержит изменяемое поле в неизменяемом объекте?

class ImmutableObject {

  private final MutableObject immutable_field;

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

class MutableObject {

  public int mutable_field;
}
  • MutableObject не имеет конструктора, который позволял бы мне устанавливать поле.
  • Текущее состояние MutableObject должно быть зафиксировано в неизменяемом объекте и никогда не изменяться. * +1007 *

Ответы [ 2 ]

7 голосов
/ 02 июня 2010

Что вам нужно сделать, это в

  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

4 голосов
/ 02 июня 2010

Ну, если предположить, что ничего не поделаешь с объявлением класса изменяемого объекта, можно использовать отражение ( Class . newIntance () и Class . getFields () ) для создания нового объекта и копирования значений полей. Вы также можете реализовать глубокое копирование таким способом. Если класс поддерживает сериализацию, тогда другим хакерским подходом было бы сериализовать объект и затем сохранить десериализованную копию. Если возможно исправить конструкцию изменчивого объекта, то это был бы лучший подход.

Редактировать
Для конкретного примера, который вы привели, ответ Ромен делает то, что вы хотите. Если у вас есть общий изменчивый объект, который не предоставляет механизм для его копирования и для которого тип может быть неизвестен до более позднего периода, то подход к отражению состоит в том, как реализовать механизм копирования.

...