Java 8 Métodos Por Defecto Explicados: Mejorar Interfaces y Compatibilidad Hacia Atrás
Java 8 introduce un nuevo concepto de implementación de método por defecto en interfaces. Esta capacidad se añade para compatibilidad hacia atrás para que las interfaces antiguas puedan aprovechar la capacidad de expresión lambda de Java 8.
Por ejemplo, las interfaces List o Collection no tienen declaración del método forEach. Así, agregar tal método simplemente rompería las implementaciones del framework de colecciones. Java 8 introduce método por defecto para que la interfaz List/Collection pueda tener una implementación por defecto del método forEach, y la clase que implementa estas interfaces no necesita implementar lo mismo.
Sintaxis
public interface Vehiculo {
default void print() {
System.out.println("¡Soy un vehículo!");
}
}
Múltiples Por Defecto
Con funciones por defecto en interfaces, hay posibilidad de que una clase implemente dos interfaces con los mismos métodos por defecto. El siguiente código explica cómo se puede resolver esta ambigüedad.
public interface Vehiculo {
default void print() {
System.out.println("¡Soy un vehículo!");
}
}
public interface CuatroRuedas {
default void print() {
System.out.println("¡Soy un vehículo de cuatro ruedas!");
}
}
La primera solución es crear un método propio que sobrescriba la implementación por defecto.
public class Coche implements Vehiculo, CuatroRuedas {
public void print() {
System.out.println("¡Soy un coche de cuatro ruedas!");
}
}
La segunda solución es llamar al método por defecto de la interfaz especificada usando super.
public class Coche implements Vehiculo, CuatroRuedas {
public void print() {
Vehiculo.super.print();
}
}
Métodos Estáticos Por Defecto
Una interfaz también puede tener métodos auxiliares estáticos desde Java 8 en adelante.
public interface Vehiculo {
default void print() {
System.out.println("¡Soy un vehículo!");
}
static void tocarBocina() {
System.out.println("¡Tocando bocina!!!");
}
}
Ejemplo de Método Por Defecto
Crea el siguiente programa Java usando cualquier editor de tu elección en, digamos, C:\JAVA.
Java8Tester.java
public class Java8Tester {
public static void main(String args[]) {
Vehiculo vehiculo = new Coche();
vehiculo.print();
}
}
interface Vehiculo {
default void print() {
System.out.println("¡Soy un vehículo!");
}
static void tocarBocina() {
System.out.println("¡Tocando bocina!!!");
}
}
interface CuatroRuedas {
default void print() {
System.out.println("¡Soy un vehículo de cuatro ruedas!");
}
}
class Coche implements Vehiculo, CuatroRuedas {
public void print() {
Vehiculo.super.print();
CuatroRuedas.super.print();
Vehiculo.tocarBocina();
System.out.println("¡Soy un coche!");
}
}
Verificar el Resultado
Compila la clase usando el compilador javac de la siguiente manera:
C:\JAVA>javac Java8Tester.java
Ahora ejecuta Java8Tester de la siguiente manera:
C:\JAVA>java Java8Tester
Debería producir la siguiente salida:
¡Soy un vehículo!
¡Soy un vehículo de cuatro ruedas!
¡Tocando bocina!!!
¡Soy un coche!
Java
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Comentarios en Java: Tipos, Uso y Mejores Prácticas
- Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
- Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
- Clases y métodos abstractos en Java: Guía completa
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
- Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código
- Java String toLowerCase() y toUpperCase(): Convertir mayúsculas/minúsculas con conciencia de locale