En Java 8, je peux facilement écrire:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
J'obtiendrai la sémantique de synchronisation complète que je pourrai également utiliser en classe. Je ne peux cependant pas utiliser le synchronized
modificateur sur les déclarations de méthode:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Maintenant, on peut dire que les deux interfaces se comportent de la même manière , sauf que Interface2
établit un contrat sur method1()
et method2()
, ce qui est un peu plus fort que ce qui le Interface1
fait. Bien sûr, nous pourrions également affirmer que les default
implémentations ne devraient pas faire d'hypothèses sur l'état d'implémentation concret, ou qu'un tel mot clé ne pourrait tout simplement pas peser.
Question:
Quelle est la raison pour laquelle le groupe d'experts JSR-335 a décidé de ne pas prendre en charge synchronized
les méthodes d'interface?
default synchronized
, mais pas nécessairement pour static synchronized
, bien que j'accepterais que ce dernier ait pu être omis pour des raisons de cohérence.
synchronized
modificateur peut être remplacé dans les sous-classes, donc cela n'aurait d'importance que s'il y avait quelque chose comme méthodes par défaut finales. (Votre autre question)
synchronized
dans les super classes, supprimant ainsi la synchronisation. Je ne serais pas surpris que le fait de ne pas soutenir synchronized
et de ne pas soutenir final
soit lié, cependant, peut-être à cause de l'héritage multiple (par exemple, héritage void x()
et synchronized void x()
, etc.). Mais c'est de la spéculation. Je suis curieux de connaître une raison faisant autorité, s'il y en a une.
super
ce qui nécessite une réimplémentation complète et un accès possible aux membres privés. D'ailleurs, il y a une raison pour laquelle ces méthodes sont appelées «défenseurs» - elles sont présentes pour permettre d'ajouter plus facilement de nouvelles méthodes.