Java 8 trae una serie de novedades, de las que nos hacíamos eco la semana pasada, que se han introducido en el lenguaje para hacer la vida más fácil al programador. Entre ellas están los métodos default.
Intentaré explicar de manera sencilla su utilidad, presentando un caso hipotético en el que podría ser necesario su uso, o al menos nos simplificaría mucho la tarea, y servirá de introducción a este nuevo tipo de métodos.
Imaginemos que tenemos definido un interface:
Imaginemos también que tenemos varias clases que implementan esta interfaz, y que estas son muchas, para que veamos más efectivamente la utilidad de esta nueva funcionalidad del lenguaje.
En el caso de que al interfaz deba añadírsele un nuevo método, se pasaría por la necesidad de escribir dicho método en todas las clases que implementen el interfaz. Esto puede ser un fastidio, pero para ello se han concebido los nuevos métodos default.
Este modificador nos permite crear un nuevo método en la interfaz, pero definiendo su implementación por defecto, de tal manera que la operación no requiera modificar las clases que hagan uso de esa interfaz. En el ejemplo anterior, definimos dos nuevos métodos, ambos con modificador default, que implementan la opción de subir y bajar un canal:
De esta forma no tenemos la necesidad de modificar las clases que hayan implementado la interfaz antes de la introducción de los nuevos métodos, ofreciendo además una implementación por defecto de estos nuevos métodos, que será heredada por estas clases, permitiendo su uso desde estas.
Cuando usamos interfaces con métodos default, podemos encontrarnos con varias posibilidades a la hora de extenderlos:
-
Que queramos dejar el método default sin cambios, y usarlo tal y como está.
-
Podemos redeclarar el método default, convirtiéndolo en un método abstracto, que necesitaría implementación.
-
Podemos redefinir el método default, lo cual lo sobreescribe y cambiaríamos el comportamiento de este.
Todo esto nos da múltiples posibilidades, podemos tener por ejemplo varias implementaciones de un método default extendiendo la interfaz inicial, y redefiniendo el método, para distintos comportamientos de las clases que implementen estos últimos. Podemos volverlo a convertir en abstracto, o podemos incluir comportamientos ya definidos en la interface padre. Y todas las combinaciones que se nos ocurran.
En Genbeta Dev | Java 8 ya está disponible | Java 8 se retrasa a 2014 Más información | Default Methods