Clases inmutables

Una clase inmutable es aquella cuyas instancias, una vez inicializadas, no pueden ser modificadas. Por ejemplo, las clases envolventes (como Character o Integer) o la clase String, son inmutables. El uso de objetos inmutables conlleva una serie de ventajas:

  • Son más seguros, puesto que nos aseguramos de que, una vez asignados los valores de sus propiedades, éstos van a permanecer siempre iguales y no van a ser modificados por otro código dentro del mismo programa
  • Se consideran thread-safe
  • Cuando dos objetos tienen el mismo estado, se puede liberar uso de memoria haciendo que las referencias a dichos objetos apunten a uno solo de ellos.

La principal desventaja de los objetos inmutables es que cualquier cambio de estado de un objeto implica la creación de una nueva instancia, lo cual implica un gasto extra de memoria. Es por ello que se recomienda crear clases mutables a partir de las clases inmutables para usar en los contextos apropiados.

Para crear clases inmutables:

  • Sus propiedades deben ser declaradas como final, y se deben inicializar en el constructor
  • Se deben suministrar unicamente métodos de acceso a los datos (getters), y no métodos que modifiquen los datos (setters). En caso de que se deba cambiar el valor de un dato, se debería crear un nuevo objeto inmutable con los cambios, y devolver la referencia
  • Cuando las propiedades son referencias a objetos mutables, se deben tener en cuenta varios aspectos:
    • Se deberá asegurar de que ningún método modifique el contenido de dichos objetos
    • No devolver nunca la referencia a esos objetos. En caso de tener que devolver el objeto, se deberá realizar un clon, y devolver ese clon.
  • Se debe declarar final, para evitar que otras clases la hereden y puedan sobrescribir sus métodos

las clases deberían ser inmutables a no ser que haya una buena razón para hacerlas mutables; si una clase no puede ser inmutable, se debe limitar su mutabilidad todo lo que sea posible

Joshua Bloch (Effective Java)

Character o Integer) o la clase String, son inmutables. El uso de objetos inmutables conlleva una serie de ventajas:

  • Son más seguros, puesto que nos aseguramos de que, una vez asignados los valores de sus propiedades, éstos van a permanecer siempre iguales y no van a ser modificados por otro código dentro del mismo programa
  • Se consideran thread-safe
  • Cuando dos objetos tienen el mismo estado, se puede liberar uso de memoria haciendo que las referencias a dichos objetos apunten a uno solo de ellos." data-share-imageurl="" style="position:fixed;bottom:0px;left:0px;">