ProgramaciónDesarrollador Java

¿Qué son las interfaces con métodos por defecto (default methods) en Java y cuáles son los matices de su uso?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Si una clase implementa dos interfaces con la misma firma de un método por defecto, se produce un conflicto, y la clase debe sobrescribir este método.
  • Los métodos por defecto no pueden sobrescribir métodos de la clase Object (por ejemplo, equals, hashCode).
  • También se pueden declarar métodos estáticos en las interfaces.

Pregunta trampa.

¿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() } }

Ejemplos de errores reales debido al desconocimiento de los detalles del tema.


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 hashCode en 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.