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 synchronizedmodificatore 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 Interface2stabilisce un contratto su method1()e su method2(), che è un po 'più forte di quello che Interface1fa. Naturalmente, potremmo anche sostenere che le defaultimplementazioni 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 synchronizedmetodi di interfaccia?
default synchronized, ma non necessariamente per static synchronized, anche se accetterei che quest'ultimo potrebbe essere stato omesso per motivi di coerenza.
synchronizedmodificatore può essere sostituito nelle sottoclassi, quindi importerebbe solo se esistesse qualcosa come metodi predefiniti finali. (L'altra tua domanda)
synchronizedin superclassi, rimuovendo efficacemente la sincronizzazione. Non sarei sorpreso dal fatto che non sostenere synchronizede non supportare finalsia 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.
superche 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.