2012-01-25 12 views
5

tengo una clase que es inmutableinmutabilidad de una clase cuando una variable de instancia presente como ArrayList

Supongamos que tengo un método getter para una variable miembro de tipo ArrayList. En ese caso, cuando obtengo una referencia a esa variable, puedo agregar o eliminar un elemento de ella. En ese caso, la inmutabilidad parece violarse.

¿Alguien puede explicar este concepto en detalle?

+2

Consulte http://stackoverflow.com/questions/8892350/immutable-vs-unmodifiable-collection – Zaki

+1

Vea también "Java efectivo" de Joshua Bloch, artículo 24: Haga copias defensivas cuando sea necesario. El capítulo está disponible en línea [aquí] (http://www.informit.com/articles/article.aspx?p=31551&seqNum=2) – mike9322

+0

Si su clase se supone que es completamente inmutable, guarde la referencia a la lista _in su clase_ (después de copiar) como una instancia de 'UnmodifiableList'. No se necesitan copias de defensa (adicionales) e impide que _your_ class lo modifique durante el mantenimiento. –

Respuesta

3

Tienes razón. La inmutabilidad es violada.

Para hacer que una clase sea inmutable, debe asegurarse de que todos sus captadores devuelvan copias seguras de cualquier clase cuyo estado podría cambiar.

3

No debe proporcionar la variable del tipo ArrayList. Proporcionar apenas List y asegurarse de que el comprador realiza una de las siguiente:

  1. devuelve una copia de la lista de
  2. o devuelve la lista no modificable

o ambos.

+1

Devolver una copia de la lista que tampoco es modificable no es necesaria –

0

si crea una nueva instancia de ese objeto cambiado de tipo X, entonces la instancia de X se considerará inmutable. Es más fácil de entender si considera su ArrayList. Usted tiene métodos para alterar esta lista. Cada método de alteración hace una copia de esta lista y agrega/elimina/actualiza en la nueva copia y regresa.

Cuestiones relacionadas