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, synchronized
değ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 Interface2
bir kurar sözleşme üzerinde method1()
ve üzerinde method2()
olandan biraz daha güçlüdür, Interface1
yapar. Tabii ki, default
uygulamaları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 synchronized
arayüz yöntemlerini desteklememeye karar vermesinin nedeni nedir ?
default synchronized
zorunlu olarak değil static synchronized
, ancak ikincisinin tutarlılık nedenlerinden dolayı ihmal edilmiş olabileceğini kabul ediyorum.
synchronized
Değ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)
synchronized
sı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 synchronized
ve desteklemeyen final
belki çoklu miras (örn miras olsa da, ilgili void x()
ve synchronized void x()
vb). Ama bu bir tahmin. Varsa, yetkili bir nedeni merak ediyorum.
super
tam 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.