Métodos por defecto de Java 8

Java 8 新特性Nuevas características de Java 8


Java 8 añade métodos por defecto a las interfaces.

En pocas palabras, los métodos por defecto consisten en que las interfaces pueden tener métodos con implementación, y no es necesario que las clases de implementación implementen esos métodos.

Solo necesitamos añadir la palabra clave `default` delante del nombre del método para implementar un método por defecto.

¿Por qué existe esta característica?

En primer lugar, la interfaz anterior era un arma de doble filo: la ventaja es que se orienta a la abstracción en lugar de a la programación concreta; la desventaja es que, cuando es necesario modificar una interfaz, hay que modificar todas las clases que la implementan. El marco de colecciones anterior a Java 8 no tenía el método foreach; la solución que suele venir a la mente es agregar nuevos métodos y sus implementaciones a las interfaces relevantes en el JDK. Sin embargo, para las versiones ya publicadas, no es posible agregar nuevos métodos a una interfaz sin afectar a las implementaciones existentes. Por eso se introdujeron los métodos por defecto. Su propósito es resolver el problema de incompatibilidad entre la modificación de una interfaz y las implementaciones existentes.

Sintaxis

La sintaxis de los métodos por defecto es la siguiente:

public interface Vehicle { default void print(){ System.out.println("¡Soy un coche!"); } }

Múltiples métodos por defecto

Una interfaz tiene métodos por defecto. Considera el caso en el que una clase implementa varias interfaces, y estas interfaces tienen el mismo método por defecto. El siguiente ejemplo ilustra cómo resolver esta situación:

public interface Vehicle { default void print(){ System.out.println("¡Soy un coche!"); } } public interface FourWheeler { default void print(){ System.out.println("¡Soy un vehículo de cuatro ruedas!"); } }

La primera solución es crear tu propio método por defecto para sobrescribir el método por defecto de la interfaz:

public class Car implements Vehicle, FourWheeler { default void print(){ System.out.println("¡Soy un automóvil de cuatro ruedas!"); } }

La segunda solución es usar `super` para invocar el método por defecto de la interfaz especificada:

public class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); } }

Métodos estáticos por defecto

Otra característica de Java 8 es que las interfaces pueden declarar (y proporcionar implementación de) métodos estáticos. Por ejemplo:

public interface Vehicle { default void print(){ System.out.println("¡Soy un coche!"); } //Métodos estáticos static void blowHorn(){ System.out.println("¡¡¡Toca la bocina!!!"); } }

Ejemplo de métodos por defecto

Podemos entender el uso de los métodos por defecto a través del siguiente código. Puedes poner el código en el archivo Java8Tester.java:

Archivo Java8Tester.java

public class Java8Tester { public static void main(String args[]){ Vehicle vehicle = new Car(); vehicle.print(); } } interface Vehicle { default void print(){ System.out.println("¡Soy un coche!"); } static void blowHorn(){ System.out.println("¡¡¡Toca la bocina!!!"); } } interface FourWheeler { default void print(){ System.out.println("¡Soy un vehículo de cuatro ruedas!"); } } class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("¡Soy un automóvil!"); } }

Al ejecutar el script anterior, el resultado es:

$ javac Java8Tester.java 
$ java Java8Tester
我是一辆车!
我是一辆四轮车!
按喇叭!!!
我是一辆汽车!

Java 8 新特性Nuevas características de Java 8

Otras extensiones