Articulo de referencia

Interfaz inmutable

En la programación orientada a objetos , la " interfaz inmutable " es un patrón para diseñar un objeto inmutable . [ 1 ] El patrón de interfaz inmutable implica definir un tipo ...

En la programación orientada a objetos , la " interfaz inmutable " es un patrón para diseñar un objeto inmutable . [ 1 ] El patrón de interfaz inmutable implica definir un tipo que no proporciona ningún método que modifique el estado. Los objetos a los que se hace referencia con ese tipo no se consideran con estado mutable y parecen inmutables.

Ejemplo

Java

Consideremos una clase Java que representa un punto bidimensional.

clase pública Point2D { entero privado x ; entero privado y ; público Point2D ( int x , int y ) { this.x = x ; this.y = y ; }public int getX () { return this . x ; } public int getY () { return this . y ; }public void setX ( int newX ) { this . x = newX ; } public void setY ( int newY ) { this . y = newY ; } }

La clase Point2D es mutable: su estado puede cambiarse después de la construcción, invocando cualquiera de los métodos setter ( setX()o setY()).

Una interfaz inmutable para Point2D podría definirse como:

interfaz pública ImmutablePoint2D { int público obtenerX (); int público obtenerY (); }

Al hacer que Point2D implemente ImmutablePoint2D, el código del cliente ahora puede hacer referencia a un tipo que no tiene métodos modificables y, por lo tanto, parece inmutable. Esto se demuestra en el siguiente ejemplo:

ImmutablePoint2D point = new Point2D ( 0 , 0 ); // una instancia concreta de Point2D es referenciada por la interfaz inmutable int x = point.getX ( ); // llamada de método válida int y = point.setX ( 42 ) ; // error de compilación: el método setX () no existe en el tipo ImmutablePoint2D

Al hacer referencia únicamente a la interfaz inmutable, no es válido llamar a un método que modifique el estado del objeto concreto.

Ventajas

  • Comunica claramente la intención inmutable del tipo.
  • A diferencia de los tipos que implementan el patrón Immutable Wrapper , no necesita "cancelar" los métodos que modifican emitiendo una instrucción " Sin operación " o lanzando una excepción en tiempo de ejecución cuando se invoca un método que modifica.

Desventajas

  • Es posible que las instancias a las que hace referencia el tipo de interfaz inmutable se conviertan a su tipo concreto y mutable, y que su estado se modifique. Por ejemplo:
    public void mutate ( ImmutablePoint2D point ) { (( Point2D ) point ). setX ( 42 ); // esta llamada es válida, ya que el tipo se ha // convertido a la clase mutable Point2D }
  • Las clases concretas deben declarar explícitamente que implementan la interfaz inmutable. Esto puede no ser posible si la clase concreta "pertenece" a código de terceros, por ejemplo, si está contenida dentro de una biblioteca.
  • El objeto no es realmente inmutable y, por lo tanto, no es adecuado para su uso en estructuras de datos que dependen de la inmutabilidad, como los mapas hash. Además, el objeto podría modificarse simultáneamente desde el lado mutable.
  • Es posible que algunas optimizaciones del compilador disponibles para objetos inmutables no estén disponibles para objetos mutables.

Alternativas

Una alternativa al patrón de interfaz inmutable es el patrón de envoltura inmutable .

Las estructuras de datos persistentes son prácticamente inmutables, al tiempo que permiten modificar la vista que tienen de sí mismas.

Referencias

  1. Interfaz inmutable , c2.com- inmutable , mindprod.com- Peter Haggar, "Práctica Java 65: Uso de herencia o delegación para definir clases inmutables" , informIT , 22 de enero de 2001