Interfaz inmutable

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 22 de marzo de 2021; las comprobaciones requieren 4 ediciones .

En la programación orientada a objetos , una " interfaz inmutable " es un patrón para diseñar un objeto inmutable . [1] [2] [3] Una interfaz inmutable incluye una definición de tipo que no expone ningún método que pueda cambiar de estado. Los objetos a los que hace referencia este tipo parecen ser inmutables.

Ejemplo

Java

Considere la clase java , que es un punto 2D.

clase pública Point2D { private int x ; int privado y ; public Point2D ( int x , int y ) { este . x = x ; esto _ y = y _ } public int getX () { devuelve esto . x ; } public int getY () { devuelve esto . y ; } public void setX ( int newX ) { this . x = nuevoX ; } public void setY ( int newY ) { this . y = nueva Y ; } }

La clase Point2D es mutable: su estado se puede cambiar después de la creación llamando a uno de los métodos setter ( setX()o setY()).

La interfaz inmutable para Point2D se puede definir como:

interfaz pública ImmutablePoint2D { public int getX (); int público getY (); }

Al hacer de Point2D una implementación de ImmutablePoint2D, el código del cliente ahora puede usar un tipo que no tiene métodos de mutación y, por lo tanto, permanece inmutable. Esto se demuestra en el siguiente ejemplo:

punto ImmutablePoint2D = nuevo Point2D ( 0 , 0 ); // la interfaz inmutable hace referencia a una instancia específica de Point2D int x = point . obtenerX (); // llamada de método de punto válido . conjuntoX ( 42 ); // error de compilación: el método setX() no existe en el tipo ImmutablePoint2D

Con solo una interfaz inmutable, no es posible llamar a un método que cambia el estado de un objeto en particular.

Beneficios

  • Transmite claramente la intención de la inmutabilidad del tipo.
  • A diferencia de los tipos que implementan el patrón contenedor inmutable, no es necesario anular los métodos de mutación utilizando una declaración de no explotación o lanzando una excepción en tiempo de ejecución cuando se invoca el método de mutación.

Desventajas

  • Es posible que las instancias a las que hace referencia una interfaz inmutable se conviertan en un tipo mutable específico y luego cambien el estado. Por ejemplo:
mutación de vacío público ( punto ImmutablePoint2D ) { (( Point2D ) punto ). conjuntoX ( 42 ); // llamada válida porque // el argumento de punto se convirtió en Point2D }
  • Las clases concretas deben declarar explícitamente una interfaz inmutable en su implementación. Esto puede no ser posible si la clase en particular es "propiedad" de un código de terceros, como si estuviera contenida en una biblioteca.
  • El objeto no es realmente inmutable y, por lo tanto, no es adecuado para su uso en estructuras de datos que requieren inmutabilidad, como los mapas hash. Y el objeto se puede cambiar al mismo tiempo en el "lado cambiable".
  • Algunas optimizaciones del compilador disponibles para objetos inmutables pueden no estar disponibles para objetos mutables.

Alternativas

Una alternativa a la interfaz inmutable es el patrón contenedor inmutable .

Enlaces

  1. Interfaz inmutable . Consultado el 10 de mayo de 2016. Archivado desde el original el 27 de septiembre de 2010.
  2. inmutable: Glosario de Java . Consultado el 10 de mayo de 2016. Archivado desde el original el 10 de abril de 2016.
  3. Práctica Java Praxis 65: Usar herencia o delegación para definir clases inmutables | Praxis práctica de Java 65: uso de herencia o delegación para definir clases inmutables | inf… . Consultado el 10 de mayo de 2016. Archivado desde el original el 3 de junio de 2016.