Pregunta

¿Cómo hago copias defensivas de un objeto mutable que contiene un campo mutable en un objeto inmutable?

class ImmutableObject {

  private final MutableObject immutable_field;

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

class MutableObject {

  public int mutable_field;
}
  • MutableObject no tiene un constructor que me permita establecer el campo.
  • El estado actual del MutableObject debe capturarse en el objeto inmutable y nunca cambiar.
¿Fue útil?

Solución

Lo que necesitas hacer es en

  MutableObject return_immutable_field() {
    return immutable_field;
  }

Cambiar a:

  MutableObject return_immutable_field() {
    MutableObject tmp = new MutableObject();
    tmp.mutable_field = immutable_field.mutable_field;
    return tmp;
  }

Para una explicación ver http://www.javapractices.com/topic/topicaction.do?id=15

Otros consejos

Bueno, suponiendo que no hay nada que hacer sobre la declaración de la clase de objeto mutable, uno podría aprovechar la reflexión (Clase.NewIntance () y Clase.getFields ()) para crear un nuevo objeto y copiar valores de campo. También puede implementar una copia profunda de esta manera. Si la clase admite la serialización, entonces otro enfoque hackish sería serializar el objeto y luego guardar una copia deserializada. Sin embargo, si es posible arreglar el diseño del objeto mutable, ese sería un mejor enfoque.

Editar
Para el ejemplo particular que has dado, la respuesta de Romain hace lo que quieres. Si tiene un objeto mutable general que no proporciona un mecanismo para copiarlo y para el cual el tipo puede no ser conocido hasta más tarde, entonces el enfoque de reflexión es cómo se implementaría un mecanismo de copia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top