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
}
}
さて、2つのインターフェースは同じように動作すると主張できます。ただし、on とon でコントラクトをInterface2
確立します。これは、何よりも少し強力です。もちろん、実装は具体的な実装状態についていかなる仮定もすべきではない、またはそのようなキーワードは単にその重みを引っ張らないと主張するかもしれません。method1()
method2()
Interface1
default
質問:
JSR-335エキスパートグループがsynchronized
インターフェースメソッドをサポートしないことにした理由は何ですか?
default synchronized
必ずしもそうでstatic synchronized
はありませんが、一貫性の理由で後者が省略されている可能性があることは認めます。
synchronized
サブクラスで修飾子がオーバーライドされる可能性があるため、この質問が値を追加するかどうかは不明です。したがって、最終的なデフォルトメソッドとして何かがあった場合にのみ問題になります。(あなたの他の質問)
synchronized
、スーパークラスで宣言されているメソッドをオーバーライドし、同期を効果的に削除できます。私はサポートしていないことに驚かないだろうsynchronized
し、サポートしていないfinal
かもしれないので、多重継承(例えば継承、しかし、関係しているvoid x()
と synchronized void x()
など、)。しかし、それは推測です。信頼できる理由があれば知りたいです。
super
完全な再実装とプライベートメンバーへの可能なアクセスを必要とする呼び出しが行われない場合のみ。ところで、これらのメソッドが「ディフェンダー」と呼ばれるのには理由があります。これらのメソッドは、新しいメソッドを簡単に追加できるようにするために存在しています。