¿Qué son los Java Mixins? . El concepto de Mixin esta asociado a la reutilización de código. Un mixin es una clase que contiene código para que otras clases lo reutilicen pero que no se apoya en la herencia para hacerlo. Dicho así suena un poco extraño pero vamos a ver un ejemplo sencillo que nos aclare el tema. Supongamos que tenemos una jerarquía de clases orientadas a muebles.
Tenemos la clase padre Mueble y varias clases hijas que heredan sus propiedades. Hasta aquí todo es normal .
package com.arquitecturajava; public class Mueble { private String color; public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
package com.arquitecturajava; public class Armario extends Mueble { }
package com.arquitecturajava; public class Mesa extends Mueble{ }
package com.arquitecturajava; public class Silla extends Mueble{ }
En este caso solo hemos añadido una propiedad a la clase Mueble y todas las clases hijas la heredan. Ahora bien ¿que pasaría si queremos añadir la funcionalidad de plegar un mueble?. Es aquí donde tenemos un problema ya que la Silla y la Mesa se pueden plegar pero no así el Armario. ¿Cómo solventamos este problema?.
Java Mixins
A partir de Java 8 , usar Java Mixins es muy sencillo . Recordemos que los interfaces soportan default methods , es decir métodos con implementación propia. Por lo tanto nos basta con construir un interface que implemente el método plegar.
Vamos a ver el código de este interface:
package com.arquitecturajava; public interface Plegable { public default void plegar() { System.out.println("el mueble se pliega"); } }
Modificamos nuestras clases para que implementen el interface:
package com.arquitecturajava; public class Silla extends Mueble implements Plegable{ }
package com.arquitecturajava; public class Mesa extends Mueble implements Plegable{ }
Podemos probar el código desde un programa main y ver como la clase Silla y Mesa implementa la nueva funcionalidad.
package com.arquitecturajava; public class Principal { public static void main(String[] args) { Mesa m= new Mesa(); m.plegar(); } }
El resultado imprimira por la consola:
Hemos usado un Java Mixin para reutilizar funcionalidad dentro de una jerarquía de clases.
Otros artículos relacionados: Java y Constructores , Java 8 Lambda , Java Streams
Interesante!
gracias 🙂
muy ilustrativo, gracias!
de nada 🙂
Tengo una duda. ¿Porqué usar una interface y no una clase que extienda de mueble MueblePlegable con esa implementación, y mesa y silla extienden de MueblePlegable? ¿Qué mejora aporta?
Permite mantener una Jerarquía de clases sencillas .En muchas casos nos encontramos con situaciones que implican añadir una pequeña funcionalidad adicional y añadimos más y más clases a la jerarquía que la acaba complicando en exceso
Muy interesante! saludos!
gracias 🙂