У Java 8 я можу легко написати:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Я отримаю повну семантику синхронізації, яку можу використовувати також у класах. Однак я не можу використовувати synchronized
модифікатор для декларацій методів:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Тепер можна стверджувати, що два інтерфейси поводяться однаково, за винятком того, що Interface2
встановлюється договір на method1()
і знову method2()
, який трохи сильніше, ніж Interface1
це. Звичайно, ми також можемо стверджувати, що default
впровадження не повинно робити жодних припущень щодо конкретного стану реалізації, або що таке ключове слово просто не набирає ваги.
Питання:
З якої причини експертна група JSR-335 вирішила не підтримувати synchronized
інтерфейсні методи?
default synchronized
, але необов'язково для цього static synchronized
, хоча я б погоджувався, що остання може бути опущена з міркувань послідовності.
synchronized
модифікатор може бути переопрацьований у підкласах, отже, це матиме значення лише за наявності кінцевих методів за замовчуванням. (Ваше інше питання)
synchronized
в суперкласах, ефективно знімаючи синхронізацію. Я не був би здивований , що не підтримує synchronized
і не підтримує final
пов'язаний, хоча, можливо , з - за множинного успадкування (наприклад , успадкування void x()
і synchronized void x()
т.д.). Але це міркування. Мені цікаво авторитетна причина, якщо вона є.
super
що вимагає повної повторної реалізації та можливого доступу до приватних членів. До речі, є причина, що ці методи називаються "захисниками" - вони існують, щоб додати нові методи.