web-dev-qa-db-ja.com

Javaでは、同期ブロック内の戻り値は不適切なスタイルのようです。それは本当に重要ですか?

WeakReference、_componentsのCollections.synchronizedListがあります。

私はコンパイラーが文句を言うのを期待して、次のようなものを書きました:

public boolean addComponent2(Component e) {
    synchronized (_components) {
        return _components.add(new WeakReference<Component>(e));
    }        
}

しかし、コンパイラは完全に満足しています。 List.add()はTRUEを返すことに注意してください。つまり、同期ブロックからの終了はロックを解放しますが、このLOOKは奇妙ではありませんか?それは一種のブロックの「穴」のようなもので、ループでreturnを使用するのと似ています。

このようなコードを維持してもらえますか?

51
Charlweed

ループから、または適切なtryブロックを持つfinallyブロックから戻るように、それは完全に問題ありません。セマンティクスを認識する必要があるだけで、その時点でそれは完全に理にかなっています。

これは、ローカル変数を導入するよりも確かに単純なコードです。

// Ick - method body is now more complicated, with no benefit
public boolean addComponent2(Component e) {
    boolean ret;
    synchronized (_components) {
        ret = _components.add(new WeakReference<Component>(e));
    }
    return ret;
}
58
Jon Skeet

synchronizedブロック内に戻ることに問題はありません。ロックは正しく解除されます。

44
Mark Byers