modulos - Interfaz de Java 9 frente a la clase
java 9 vs java 8 (4)
La interfaz Java en la versión 9 tiene métodos privados pero estáticos privados. La característica se ha introducido para permitir métodos modulares. Una función debería funcionar con una responsabilidad en lugar de usar métodos predeterminados largos. No tiene nada que ver con Herencia múltiple. Mientras más métodos estáticos sean privados, más podrá escribir el código limpio y reutilizable. De todas formas, los métodos estáticos, ya sean públicos o protegidos, no pueden anularse.
Como Java 9 nos va a permitir definir métodos private static
private
y private static
también en las interfaces, ¿cuál sería la diferencia restante en la interface
y la class
? Además, ¿se está moviendo Java hacia la herencia múltiple lentamente?
Las interfaces de Java 9 aún no pueden contener campos y constructores. Esto hace una gran diferencia entre las clases y las interfaces, por lo que Java 9 está lejos de la herencia múltiple.
Los métodos de interfaz privada en Java 9 se comportan exactamente como otros métodos privados: deben tener un cuerpo (incluso en clases abstractas) y no pueden ser llamados ni reemplazados por subclases. Como tales, realmente no interactúan con la herencia. Hablando de eso (y particularmente de la herencia múltiple), hay (¿al menos?) Tres tipos de ella:
- La herencia de tipos significa que un tipo puede ser de otro tipo, por ejemplo,
String
es unObject
. Java permitió la herencia múltiple de tipos desde el primer día (a través de interfaces). - La herencia del comportamiento significa que un tipo puede heredar el comportamiento de otro tipo. Antes de Java 8, solo las clases podían implementar métodos, por lo que solo existía una herencia única de este tipo. Con Java 8 llegaron los métodos por defecto, que permitieron a las interfaces implementar métodos, dando a Java herencia múltiple de comportamiento.
- La herencia del estado significa que un tipo hereda el estado interno de otro tipo (es decir, campos). Tal como está (Java 9 y todo lo que actualmente se propone para futuras versiones de Java), solo las clases pueden tener estado, por lo que solo existe una herencia única de este tipo.
Como puede ver, los métodos de interfaz privada no agregan nada aquí.
Con respecto a su pregunta de cómo se comparan las interfaces y las clases, existen dos diferencias principales: herencia múltiple y estado. Las interfaces admiten lo primero, las clases pueden tener lo último. Dado que el estado es muy importante en un OOP típico, las clases seguirán siendo relevantes. 😉
Si hubiera una forma de que una interfaz forzara a una implementación a tener un campo particular no público o definir uno directamente, el juego cambiaría y las interfaces podrían competir con las clases.
Los métodos privados no son heredados por subclases, por lo que esta característica no afecta a las clases de implementación. Creo que los métodos privados en las interfaces nos permiten compartir el código entre los métodos predeterminados.
Las interfaces Java todavía no pueden tener miembros no estáticos. Esa es una gran diferencia y no una herencia múltiple IMO.