Una de las características más útiles de Java 8 son los nuevos defaultmé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 Senderfuera 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, defaulty finalobviamente 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 staticy finalen 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, staticse 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?
finalevita 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
finaltendría un uso para evitar que las clases de implementación anulen la implementación predeterminada de un método de interfaz.