In Java 8 kann ich leicht schreiben:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Ich werde die vollständige Synchronisationssemantik erhalten, die ich auch in Klassen verwenden kann. Ich kann den synchronized
Modifikator jedoch nicht für Methodendeklarationen verwenden:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Nun kann man argumentieren , dass die beiden Schnittstellen verhalten sich die gleiche Weise , außer dass Interface2
ein legt Vertrag auf method1()
und auf method2()
, die ein wenig stärker als das , was der Interface1
Fall ist. Natürlich könnten wir auch argumentieren, dass default
Implementierungen keine Annahmen über den konkreten Implementierungsstatus treffen sollten oder dass ein solches Schlüsselwort einfach nicht an Bedeutung gewinnen würde.
Frage:
Was ist der Grund, warum die JSR-335-Expertengruppe beschlossen hat, synchronized
Schnittstellenmethoden nicht zu unterstützen ?
default synchronized
, aber nicht unbedingt für static synchronized
, obwohl ich akzeptieren würde, dass letzteres aus Konsistenzgründen weggelassen worden sein könnte.
synchronized
Modifikator in Unterklassen möglicherweise überschrieben wird. Daher wäre es nur wichtig, wenn es etwas als endgültige Standardmethode gäbe. (Ihre andere Frage)
synchronized
in Superklassen deklariert sind, wodurch die Synchronisation effektiv entfernt wird. Es würde mich nicht wundern , wenn nicht unterstützt synchronized
und nicht unterstützt final
wird, möglicherweise aufgrund von Mehrfachvererbung (z. B. Vererbung void x()
und synchronized void x()
usw.). Aber das ist Spekulation. Ich bin neugierig auf einen maßgeblichen Grund, falls es einen gibt.
super
was eine vollständige Neuimplementierung und einen möglichen Zugriff auf private Mitglieder erfordert. Übrigens gibt es einen Grund, warum diese Methoden als "Verteidiger" bezeichnet werden - sie sind vorhanden, um das Hinzufügen neuer Methoden zu erleichtern.