En Java 8, las interfaces pueden contener métodos implementados, métodos estáticos y los llamados métodos "predeterminados" (que las clases de implementación no necesitan anular).
En mi opinión (probablemente ingenua), 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 puedes usar una clase abstracta para este propósito.
En breve:
Antes de Java 8:
- Puede 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 implementando clases.
- No puede agregar un nuevo método en una interfaz sin modificar todas las implementaciones, pero esto es realmente algo bueno.
Después de Java 8:
- Prácticamente no hay diferencia entre una interfaz y una clase abstracta (que no sea herencia múltiple). De hecho, puede emular una clase regular con una interfaz.
- Al programar las implementaciones, los programadores pueden olvidar 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 teniendo en cuenta esa nueva funcionalidad, y esto puede causar problemas. Por ejemplo, si alguien agrega un nuevo método predeterminado
default void foo()
a una interfazIx
, la clase queCx
implementaIx
y tiene unfoo
método privado con la misma firma no se compila.
¿Cuáles son las principales razones de estos cambios importantes y qué nuevos beneficios (si los hay) agregan?
@Deprecated
categoría! Los métodos estáticos son una de las construcciones más abusadas en Java, debido a la ignorancia y la pereza. Muchos métodos estáticos generalmente significan un programador incompetente, aumentan el acoplamiento en varios órdenes de magnitud y son una pesadilla para la prueba unitaria y la refactorización cuando te das cuenta de por qué son una mala idea.