Java 8'de kolayca yazabilirim:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Sınıflarda da kullanabileceğim tam senkronizasyon anlambilimini alacağım. Ancak, synchronizeddeğiştirici yöntem bildirimlerinde kullanamıyorum :
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Şimdi, bir haricinde aynı şekilde davranmasına iki arayüzleri iddia edebilir Interface2bir kurar sözleşme üzerinde method1()ve üzerinde method2()olandan biraz daha güçlüdür, Interface1yapar. Tabii ki, defaultuygulamaların somut uygulama durumu hakkında herhangi bir varsayımda bulunmaması gerektiğini veya böyle bir anahtar kelimenin ağırlığını çekmeyeceğini de iddia edebiliriz .
Soru:
JSR-335 uzman grubunun synchronizedarayüz yöntemlerini desteklememeye karar vermesinin nedeni nedir ?
default synchronizedzorunlu olarak değil static synchronized, ancak ikincisinin tutarlılık nedenlerinden dolayı ihmal edilmiş olabileceğini kabul ediyorum.
synchronizedDeğiştirici alt sınıflarda geçersiz kılınmış olabilir bu nedenle herhangi bir değer ekleyip eklemediğinden emin değilim , bu nedenle sadece son varsayılan yöntemler olarak bir şey olsaydı önemli olurdu. (Başka sorunuz)
synchronizedsınıflar, süper sınıflarda bildirilen yöntemleri geçersiz kılarak senkronizasyonu etkin bir şekilde kaldırabilir . Ben destekleyen değil sürpriz olmaz synchronizedve desteklemeyen finalbelki çoklu miras (örn miras olsa da, ilgili void x() ve synchronized void x() vb). Ama bu bir tahmin. Varsa, yetkili bir nedeni merak ediyorum.
supertam bir yeniden uygulama ve özel üyelere olası erişim gerektiren çağrılamazlarsa . Btw, bu yöntemlerin "savunucu" olarak adlandırılmasının bir nedeni var - yeni yöntemlerin daha kolay eklenmesine izin vermek için mevcutlar.