L'une des caractéristiques les plus utiles de Java 8 sont les nouveaux default
méthodes sur les interfaces. Il y a essentiellement deux raisons (il peut y en avoir d'autres) pourquoi ils ont été introduits:
- Le fait de donner des implémentations par défaut. Exemple:
Iterator.remove()
- Permettant de l'API du JDK évolution. Exemple:
Iterable.forEach()
À partir d'une API designer point de vue, j'aurais aimé être capable d'utiliser d'autres modificateurs sur les méthodes d'interface, par exemple, final
. Cela peut être utile lors de l'ajout de méthodes pratiques, la prévention "accidentelle" remplace dans la mise en œuvre des classes:
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);
}
Le ci-dessus est déjà pratique courante si Sender
ont une classe:
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);
}
Maintenant, default
et final
sont évidemment contradictoires mots-clés, mais le mot clé default lui-même n'aurait pas été strictement nécessaire, donc je suis en supposant que cette contradiction est délibérée, afin de refléter les différences subtiles entre les "méthodes de la classe avec le corps" (juste des méthodes) et "les méthodes d'interface avec le corps" (méthodes par défaut), c'est à dire les différences qui je n'ai pas encore compris.
À un certain moment, le soutien pour les modificateurs comme static
et final
sur les méthodes d'interface n'est pas encore totalement exploré, citant Brian Goetz:
L'autre partie c'est la façon dont nous allons aller à la classe de soutien-bâtiment outils d'interfaces, telles que la finale de méthodes, les méthodes privées, protégées des méthodes, des méthodes statiques, etc. La réponse est: nous ne savons pas encore
Depuis ce temps, à la fin de 2011, à l'évidence, le soutien pour l' static
méthodes des interfaces a été ajouté. Clairement, cela ajoute beaucoup de valeur à la JDK les bibliothèques elles-mêmes, comme avec Comparator.comparing()
.
Question:
Quelle est la raison final
(et aussi static final
) n'a jamais fait de Java 8 interfaces?
Note, avant que cette question est très fermé: Pour ajustement de Débordement de Pile Q&r format: je suis à la recherche d'autorité citations seulement, pas de la spéculation. Une réponse ferme à cette question sera probablement aider beaucoup de futurs visiteurs de cette question, donc merci de ne pas le fermer avec impatience.