Di Java 8, saya dapat dengan mudah menulis:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Saya akan mendapatkan semantik sinkronisasi penuh yang dapat saya gunakan juga di kelas. Namun saya tidak bisa menggunakan synchronized
pengubah pada deklarasi metode:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Sekarang, orang dapat berargumen bahwa kedua antarmuka berperilaku dengan cara yang sama kecuali yang Interface2
membuat kontrak terus method1()
-menerus method2()
, yang sedikit lebih kuat daripada apa yang Interface1
dilakukan. Tentu saja, kami mungkin juga berpendapat bahwa default
implementasi tidak boleh membuat asumsi tentang keadaan implementasi konkret, atau bahwa kata kunci seperti itu tidak akan menarik.
Pertanyaan:
Apa alasan mengapa kelompok ahli JSR-335 memutuskan untuk tidak mendukung synchronized
metode antarmuka?
default synchronized
, tetapi belum tentu untuk static synchronized
, meskipun saya akan menerima bahwa yang terakhir mungkin telah dihilangkan karena alasan konsistensi.
synchronized
pengubahnya mungkin ditimpa dalam subkelas, maka itu hanya masalah jika ada sesuatu sebagai metode default akhir. (Pertanyaan Anda yang lain)
synchronized
di kelas super, secara efektif menghapus sinkronisasi. Saya tidak akan terkejut bahwa tidak mendukung synchronized
dan tidak mendukung final
terkait, mungkin karena beberapa pewarisan (misalnya mewarisi void x()
dan synchronized void x()
, dll.). Tapi itu spekulasi. Saya ingin tahu tentang alasan otoritatif, jika ada.
super
yang membutuhkan implementasi ulang penuh dan kemungkinan akses ke anggota pribadi. Btw, ada alasan metode-metode itu disebut "pembela" - mereka hadir untuk memudahkan menambahkan metode baru.