En Java 8 apareció el concepto de default methods: son métodos con implementación, declarados dentro de una interfaz. Permiten agregar nuevos métodos a las interfaces sin romper la compatibilidad con implementaciones existentes.
Sintaxis:
public interface MyInterface { default void printHello() { System.out.println("¡Hola!"); } }
Características y detalles:
Object (por ejemplo, equals, hashCode).¿Qué ocurrirá si una clase implementa dos interfaces con el mismo método por defecto y no sobrescribe este método?
Respuesta: El compilador generará un error "class... inherits unrelated defaults for ... from types ... and ...", y se requerirá implementar explícitamente este método en la clase.
Ejemplo:
interface A { default void doSomething() { System.out.println("A"); } } interface B { default void doSomething() { System.out.println("B"); } } class C implements A, B {} // ¡Error de compilación!
Solución:
class C implements A, B { @Override public void doSomething() { A.super.doSomething(); // o B.super.doSomething() } }
Historia
En un proyecto de equipo para migrar APIs, se añadió un método por defecto en una interfaz común. Las implementaciones antiguas de la interfaz no sobrescribieron el nuevo método, lo que llevó a un comportamiento inesperado, ya que se ejecutaba la implementación por defecto en lugar de la lógica esperada. Como resultado, los usuarios notaron una caída en la funcionalidad.
Historia
Al ampliar la biblioteca, uno de los desarrolladores añadió un método por defecto con lógica de negocio en una interfaz común. La posterior adición de un método similar con diferente comportamiento en otra interfaz causó un conflicto de herencia, lo que impidió compilar nuevas implementaciones.
Historia
Un desarrollador intentó usar un método por defecto llamado
hashCodeen la interfaz, esperando que esto afectara el sobrescritura del método en las clases heredadas, pero el compilador no permitió esto. Esto llevó a una larga investigación sobre las causas del error y una reestructuración de las interfaces.