En Java 8, las interfaces pueden contener métodos implementados, métodos estáticos y los llamados métodos "predeterminados" (que las clases implementadoras no necesitan anular).
En mi (probablemente ingenua) vista, no había necesidad de violar interfaces como esta. Las interfaces siempre han sido un contrato que debe cumplir, y este es un concepto muy simple y puro. Ahora es una mezcla de varias cosas. En mi opinión:
- los métodos estáticos no pertenecen a las interfaces. Pertenecen a clases de utilidad.
- Los métodos "predeterminados" no deberían haberse permitido en las interfaces. Siempre se podría utilizar una clase abstracta para este propósito.
En resumen:
Antes de Java 8:
- Podría usar clases abstractas y regulares para proporcionar métodos estáticos y predeterminados. El papel de las interfaces es claro.
- Todos los métodos en una interfaz deben ser anulados por la implementación de clases.
- No puede agregar un nuevo método en una interfaz sin modificar todas las implementaciones, pero esto es realmente bueno.
Después de Java 8:
- No hay prácticamente ninguna diferencia entre una interfaz y una clase abstracta (aparte de la herencia múltiple). De hecho, puede emular una clase regular con una interfaz.
- Al programar las implementaciones, los programadores pueden olvidarse de anular los métodos predeterminados.
- Hay un error de compilación si una clase intenta implementar dos o más interfaces que tienen un método predeterminado con la misma firma.
- Al agregar un método predeterminado a una interfaz, cada clase de implementación hereda automáticamente este comportamiento. Es posible que algunas de estas clases no hayan sido diseñadas con esa nueva funcionalidad en mente, y esto puede causar problemas. Por ejemplo, si alguien agrega un nuevo método predeterminado
default void foo()
a una interfazIx
, entonces la claseCx
implementaIx
y tiene un método privadofoo
con la misma firma no se compila.
¿Cuáles son las razones principales de tales cambios importantes y qué nuevos beneficios (si los hay) agregan?