¿Cuál es la razón por la cual "sincronizado" no está permitido en los métodos de interfaz Java 8?
En Java 8, puedo escribir fácilmente:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Obtendré la semántica de sincronización completa que puedo usar también en las clases. Sin embargo, no puedo usar elsynchronized
modificador en las declaraciones de método:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Ahora, uno puede argumentar que las dos interfaces se comportan de la misma manera, excepto queInterface2
establece uncontrato enmethod1()
y enmethod2()
, que es un poco más fuerte de lo queInterface1
hace. Por supuesto, también podríamos argumentar quedefault
Las implementaciones no deben hacer suposiciones sobre el estado de implementación concreto, o que tal palabra clave simplemente no ejercería su peso.
¿Cuál es la razón por la cual el grupo de expertos JSR-335 decidió no apoyarsynchronized
en los métodos de interfaz?