In Java 8, posso facilmente scrivere:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Otterrò la semantica della sincronizzazione completa che posso usare anche in classe. Non posso, tuttavia, utilizzare il synchronized
modificatore nelle dichiarazioni dei metodi:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Ora, si può sostenere che le due interfacce si comportano allo stesso modo, tranne che Interface2
stabilisce un contratto su method1()
e su method2()
, che è un po 'più forte di quello che Interface1
fa. Naturalmente, potremmo anche sostenere che le default
implementazioni non dovrebbero fare ipotesi su uno stato di implementazione concreto, o che una tale parola chiave semplicemente non trarrebbe il suo peso.
Domanda:
Qual è il motivo per cui il gruppo di esperti JSR-335 ha deciso di non supportare synchronized
metodi di interfaccia?
default synchronized
, ma non necessariamente per static synchronized
, anche se accetterei che quest'ultimo potrebbe essere stato omesso per motivi di coerenza.
synchronized
modificatore può essere sostituito nelle sottoclassi, quindi importerebbe solo se esistesse qualcosa come metodi predefiniti finali. (L'altra tua domanda)
synchronized
in superclassi, rimuovendo efficacemente la sincronizzazione. Non sarei sorpreso dal fatto che non sostenere synchronized
e non supportare final
sia correlato, forse, forse a causa dell'eredità multipla (ad esempio ereditare void x()
e synchronized void x()
, ecc.). Ma questa è una speculazione. Sono curioso di sapere un motivo autorevole, se ce n'è uno.
super
che richiede una reimplementazione completa e un possibile accesso ai membri privati. A proposito, c'è una ragione per cui questi metodi sono chiamati "difensori" - sono presenti per consentire più facilmente l'aggiunta di nuovi metodi.