¿Por qué no está permitido "final" en los métodos de interfaz Java 8?
Una de las características más útiles de Java 8 son las nuevasdefault
métodos en interfaces. Básicamente, hay dos razones (puede haber otras) por las que se han introducido:
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, p.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 siSender
fueron 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
yfinal
obviamente son palabras clave contradictorias, pero la palabra clave predeterminada en sí mismano habría sido estrictamente requerido, así que supongo que esta contradicción es deliberada, para reflejar las sutiles diferencias entre"métodos de clase con cuerpo" (solo métodos) y"métodos de interfaz con cuerpo" (métodos predeterminados), es decir, diferencias que aún no he entendido.
En algún momento, soporte para modificadores comostatic
yfinal
en los métodos de interfaz aún no se ha 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, el apoyo astatic
Se agregaron métodos en las interfaces. Claramente, esto agregó mucho valor a las bibliotecas JDK en sí mismas, como conComparator.comparing()
.
Cual es la razonfinal
(y tambiénstatic final
) nunca llegó a las interfaces Java 8?