Una de las características más útiles de Java 8 son los nuevos default
métodos en las interfaces. Básicamente, hay dos razones (puede haber otras) por las que se han introducido:
- Proporcionar implementaciones predeterminadas reales. Ejemplo:
Iterator.remove()
- Permitiendo la evolución de la API JDK. Ejemplo:
Iterable.forEach()
Desde la perspectiva de un diseñador de API, me hubiera gustado poder usar otros modificadores en los métodos de interfaz, por ejemplo final
. Esto sería útil al agregar métodos de conveniencia, evitando anulaciones "accidentales" en la implementación de clases:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Lo anterior ya es una práctica común si Sender
fuera una clase:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Ahora, default
y final
obviamente son palabras clave contradictorias, pero la palabra clave predeterminada en sí misma no habría sido estrictamente requerida , por lo que supongo que esta contradicción es deliberada, para reflejar las sutiles diferencias entre "métodos de clase con cuerpo" (solo métodos) e "interfaz métodos con cuerpo " (métodos predeterminados), es decir, diferencias que aún no he entendido.
En algún momento, el soporte para modificadores como static
y final
en los métodos de interfaz aún no se había explorado por completo, citando a Brian Goetz :
La otra parte es hasta dónde vamos a llegar para admitir herramientas de creación de clases en interfaces, como métodos finales, métodos privados, métodos protegidos, métodos estáticos, etc. La respuesta es: todavía no lo sabemos
Desde ese momento a finales de 2011, obviamente, static
se agregó soporte para métodos en interfaces. Claramente, esto agregó mucho valor a las propias bibliotecas JDK, como con Comparator.comparing()
.
Pregunta:
¿Cuál es la razón final
(y también static final
) nunca llegó a las interfaces Java 8?
final
evita que un método se anule, y al ver cómo DEBES anular los métodos heredados de las interfaces, no veo por qué tendría sentido hacerlo definitivo. A menos que sea para indicar que el método es final DESPUÉS de anularlo una vez ... En ese caso, ¿tal vez haya dificultades? Si no entiendo este derecho, por favor déjame kmow. Parece interesante
final
tendría un uso para evitar que las clases de implementación anulen la implementación predeterminada de un método de interfaz.