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 el synchronized
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, se puede argumentar que las dos interfaces se comportan de la misma manera excepto que Interface2
establece un contrato en method1()
y en method2()
, que es un poco más fuerte que lo Interface1
hace. Por supuesto, también podríamos argumentar que las default
implementaciones no deberían hacer suposiciones sobre el estado de implementación concreto, o que dicha palabra clave simplemente no aumentaría su peso.
Pregunta:
¿Cuál es la razón por la cual el grupo de expertos JSR-335 decidió no admitir los synchronized
métodos de interfaz?
default synchronized
, pero no necesariamente static synchronized
, aunque aceptaría que esta última podría haberse omitido por razones de coherencia.
synchronized
modificador puede ser anulado en las subclases, por lo tanto, solo importaría si hubiera algo como métodos predeterminados finales. (Su otra pregunta)
synchronized
en superclases, eliminando efectivamente la sincronización. Sin embargo, no me sorprendería que no admitir synchronized
y no admitir final
esté relacionado, tal vez debido a la herencia múltiple (por ejemplo, herencia void x()
y synchronized void x()
, etc.). Pero eso es especulación. Tengo curiosidad acerca de una razón autorizada, si hay una.
super
que requiere una reimplementación completa y un posible acceso a miembros privados. Por cierto, hay una razón por la cual esos métodos se llaman "defensores": están presentes para permitir la adición de nuevos métodos más fácilmente.