Warum ist "final" in Java 8-Schnittstellenmethoden nicht zulässig?
Eine der nützlichsten Funktionen von Java 8 sind die neuendefault
Methoden an Schnittstellen. Es gibt im Wesentlichen zwei Gründe (es kann auch andere Gründe geben), warum sie eingeführt wurden:
Iterator.remove()
JDK-API-Entwicklung zulassen. Beispiel:Iterable.forEach()
Aus Sicht eines API-Designers hätte ich gerne andere Modifikatoren für Schnittstellenmethoden verwendet, z.final
. Dies ist nützlich, wenn Sie Komfortmethoden hinzufügen und "ac, cidental" -Overrides in implementierenden Klassen 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, wennSender
waren eine Klasse:
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);
}
Jetzt,default
undfinal
sind offensichtlich widersprüchliche Keywords, aber das Standard-Keyword selbstwäre nicht unbedingt erforderlich gewesenIch gehe also davon aus, dass dieser Widerspruch absichtlich ist, um die subtilen Unterschiede zwischen zu reflektieren"Klassenmethoden mit Körper" (nur Methoden) und"Schnittstellenmethoden mit Körper" (Standardmethoden), d. h. Unterschiede, die ich noch nicht verstanden habe.
Irgendwann Unterstützung für Modifikatoren wiestatic
undfinal
über Schnittstellenmethoden wurde noch nicht vollständig erforscht,unter Berufung auf Brian Goetz:
Der andere Teil ist, wie weit wir gehen, um Tools zur Klassenbildung in Schnittstellen zu unterstützen, wie endgültige Methoden, private Methoden, geschützte Methoden, statische Methoden usw. Die Antwort lautet: Wir wissen es noch nicht
Seit dieser Zeit Ende 2011 natürlich Unterstützung fürstatic
Methoden in Schnittstellen wurde hinzugefügt. Dies hat den JDK-Bibliotheken selbst zweifellos viel Wert verliehen, wie z. B. mitComparator.comparing()
.
Was ist der Grundfinal
(und auchstatic final
) hat es noch nie zu Java 8 Interfaces geschafft?