L'une des fonctionnalités les plus utiles de Java 8 est la nouvelle default
méthodes sur les interfaces. Il y a essentiellement deux raisons (il peut y en avoir d'autres) pour lesquelles elles ont été introduites:
- Fournir des implémentations par défaut réelles. Exemple:
Iterator.remove()
- Permettant l'évolution de l'API JDK. Exemple:
Iterable.forEach()
Du point de vue d'un concepteur d'API, j'aurais aimé pouvoir utiliser d'autres modificateurs sur les méthodes d'interface, par exemple final
. Cela serait utile lors de l'ajout de méthodes pratiques, empêchant les remplacements "accidentels" dans l'implémentation 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);
}
Ce qui précède est déjà une pratique courante si Sender
était 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 des mots-clés contradictoires, mais le mot-clé par défaut lui-même n'aurait pas été strictement requis , donc je suppose que cette contradiction est délibérée, pour refléter les différences subtiles entre les "méthodes de classe avec le corps" (juste méthodes) et "interface" méthodes avec corps " (méthodes par défaut), c'est-à-dire des différences que je n'ai pas encore comprises.
À un certain moment, la prise en charge des modificateurs comme static
et final
sur les méthodes d'interface n'était pas encore complètement explorée, citant Brian Goetz :
L'autre partie est de savoir jusqu'où nous allons aller pour prendre en charge les outils de création de classe dans les interfaces, telles que les méthodes finales, les méthodes privées, les méthodes protégées, les méthodes statiques, etc. La réponse est: nous ne savons pas encore
Depuis cette époque fin 2011, évidemment, le support des static
méthodes dans les interfaces a été ajouté. De toute évidence, cela a ajouté beaucoup de valeur aux bibliothèques JDK elles-mêmes, comme avec Comparator.comparing()
.
Question:
Quelle est la raison final
(et aussi static final
) qui n'est jamais arrivée aux interfaces Java 8?
final
empêche une méthode d'être surchargée, et vu comment vous DEVEZ remplacer les méthodes héritées des interfaces, je ne vois pas pourquoi il serait logique de la rendre définitive. A moins que cela ne signifie que la méthode est définitive APRÈS l'avoir remplacée une fois .. Dans ce cas, peut-être y a-t-il des difficultés? Si je ne comprends pas ce droit, laissez-moi kmow. Semble intéressant
final
aurait une utilité pour empêcher l'implémentation des classes de remplacer l'implémentation par défaut d'une méthode d'interface.