java oop interface java-8

¿Por qué agregar métodos predeterminados a las interfaces en Java 8 es una buena opción de diseño y cuáles son las alternativas[duplicar]?



oop java-8 (1)

¿Por qué se introdujo esta característica de lenguaje?

Se agregó principalmente para permitirle agregar métodos a las interfaces existentes que ya están en uso sin romper el código de todos, pero también para compartir implementaciones de métodos "horizontalmente" en todas las clases que implementan la misma interfaz (a diferencia de la distribución "vertical" a través de la herencia).

¿Qué nuevas características clave soporta? (por ejemplo Splititerators )

java.util.Collection<T>.stream()

¿Qué otras alternativas había para apoyar esas características de lenguaje? Por ejemplo, ¿por qué no crear una nueva interfaz SplitIterable que amplíe Iterable ?

Puede optar por interfaces completamente nuevas y continuar con la clase auxiliar auxiliar asociada (por ejemplo, la interfaz Collection<T> y su clase auxiliar auxiliar Collections ). Esto no sería terrible; de ​​hecho, se podría argumentar que los métodos predeterminados son puramente un azúcar sintáctico además de los métodos estáticos * . Sin embargo, los métodos predeterminados generalmente proporcionan una mejor legibilidad.

¿Cuál sería el impacto de implementar esas alternativas (proliferación de interfaces)?

Usted terminaría con una biblioteca menos consistente y un lenguaje menos legible, pero no sería el fin del mundo. Una preocupación mayor, como lo señaló Joachim Sauer , es que las implementaciones de la interfaz no tendrían manera de anular la implementación de la clase de ayuda estática. Eso quitaría flexibilidad.

¿Debo proporcionar una implementación predeterminada para un método en la primera edición de la interfaz cuando sea posible implementarla como una composición de otros métodos?

Debe hacerlo solo si necesita compartir la implementación "horizontalmente". Si un método proporciona un comportamiento esencial de la implementación, no proporcione un valor predeterminado para él.

* Esto sería una simplificación excesiva, porque los métodos predeterminados siguen siendo virtuales. Gracias Brian Goetz por el comentario.

Esta pregunta ya tiene una respuesta aquí:

Solo estoy aprendiendo Java, por lo que me resulta difícil acceder a las posibles alternativas y al impacto de tal decisión de diseño.

Java 8 agrega la función de métodos predeterminados a las interfaces, lo que permite que las interfaces tengan una implementación. Esto permite ampliar las interfaces existentes con nuevos métodos, sin romper los clientes, evolucionando la interfaz a lo largo del tiempo de una manera compatible con versiones anteriores. Sin embargo, dada la implementación predeterminada, dichas extensiones son algo limitadas y es probable que se implementen utilizando los métodos de interfaz existentes de la interfaz o los métodos de biblioteca. Así que mi pregunta es

  • ¿Por qué se introdujo esta característica de lenguaje?
  • ¿Qué nuevas características clave soporta? (por ejemplo Splititerators)
  • ¿Qué otras alternativas había para apoyar esas características de lenguaje? Por ejemplo, ¿por qué no crear una nueva interfaz SplitIterable que amplíe Iterable?
  • ¿Cuál sería el impacto de implementar esas alternativas (poliferación de las interfaces)?
  • ¿Debo proporcionar una implementación predeterminada para un método en la primera edición de la interfaz cuando sea posible implementarla como una composición de otros métodos?