No Java 8, eu posso escrever facilmente:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Vou obter a semântica de sincronização completa que também posso usar nas aulas. No entanto, não posso usar o synchronized
modificador nas declarações do método:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Agora, pode-se argumentar que as duas interfaces comportam da mesma maneira, exceto que Interface2
estabelece um contrato no method1()
e no method2()
, que é um pouco mais forte do que o que Interface1
faz. Obviamente, também podemos argumentar que as default
implementações não devem fazer suposições sobre o estado concreto da implementação, ou que essa palavra-chave simplesmente não daria seu peso.
Questão:
Qual é a razão pela qual o grupo de especialistas JSR-335 decidiu não oferecer suporte synchronized
nos métodos de interface?
default synchronized
, mas não necessariamente para static synchronized
, embora eu aceite que o último possa ter sido omitido por motivos de consistência.
synchronized
modificador pode ser substituído nas subclasses, portanto, só importaria se houvesse algo como métodos padrão finais. (Sua outra pergunta)
synchronized
nas superclasses, removendo efetivamente a sincronização. Não me surpreenderia que não apoiar synchronized
e não apoiar final
esteja relacionado, talvez por causa de herança múltipla (por exemplo, herança void x()
e synchronized void x()
etc.). Mas isso é especulação. Estou curioso sobre uma razão autorizada, se houver uma.
super
que requer uma reimplementação completa e possível acesso a membros privados. Aliás, há uma razão para que esses métodos sejam chamados de "defensores" - eles estão presentes para facilitar a adição de novos métodos.