Eine der nützlichsten Funktionen von Java 8 sind die neuen default
Methoden für Schnittstellen. Es gibt im Wesentlichen zwei Gründe (es kann andere geben), warum sie eingeführt wurden:
- Bereitstellung der tatsächlichen Standardimplementierungen. Beispiel:
Iterator.remove()
- Berücksichtigung der JDK-API-Evolution. Beispiel:
Iterable.forEach()
Aus Sicht eines API-Designers hätte ich gerne andere Modifikatoren für Schnittstellenmethoden verwenden können, z final
. Dies ist nützlich, wenn Sie praktische Methoden hinzufügen, um "versehentliche" Überschreibungen bei der Implementierung von Klassen zu verhindern:
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);
}
Das Obige ist bereits gängige Praxis, wenn Sender
es sich um eine Klasse handelt:
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);
}
Nun, default
und final
widersprechen offensichtlich Schlüsselwörtern, aber das Standardschlüsselwort selbst wäre nicht unbedingt erforderlich gewesen , daher gehe ich davon aus, dass dieser Widerspruch absichtlich ist, um die subtilen Unterschiede zwischen "Klassenmethoden mit Körper" (nur Methoden) und "Schnittstelle" widerzuspiegeln Methoden mit Körper " (Standardmethoden), dh Unterschiede, die ich noch nicht verstanden habe.
Zu einem bestimmten Zeitpunkt wurde die Unterstützung für Modifikatoren wie static
und final
für Schnittstellenmethoden noch nicht vollständig untersucht, unter Berufung auf Brian Goetz :
Der andere Teil ist, wie weit wir gehen werden, um Tools zum Erstellen von Klassen in Schnittstellen wie endgültigen Methoden, privaten Methoden, geschützten Methoden, statischen Methoden usw. zu unterstützen. Die Antwort lautet: Wir wissen es noch nicht
Seit dieser Zeit Ende 2011 wurde offensichtlich die Unterstützung für static
Methoden in Schnittstellen hinzugefügt. Dies hat den JDK-Bibliotheken selbst, wie z. B. mit, einen großen Mehrwert gebracht Comparator.comparing()
.
Frage:
Was ist der Grund final
(und auch static final
), warum es nie zu Java 8-Schnittstellen gekommen ist?
final
verhindert , dass eine Methode überschrieben wird, und wenn Sie sehen, wie Sie Methoden überschreiben MÜSSEN, die von Schnittstellen geerbt wurden, sehe ich nicht, warum es sinnvoll wäre, sie endgültig zu machen. Es sei denn, es sollte bedeuten, dass die Methode endgültig ist, nachdem sie einmal überschrieben wurde. In diesem Fall gibt es möglicherweise qas Schwierigkeiten? Wenn ich dieses Recht nicht verstehe, lass mich bitte kmow. Scheint interessant
final
könnte verhindert werden, dass implementierende Klassen die Standardimplementierung einer Schnittstellenmethode überschreiben.