final
フィールドを含まない効果的な不変オブジェクトをスレッドセーフな方法で使用するには、オブジェクトを初期化後に他のスレッドが使用できるようにするときに安全な公開慣用法の1つを使用する必要があります。 (Java Concurrency in Practiceから)状態:
- 静的初期からオブジェクト参照を初期化します。
- 揮発性フィールドまたはAtomicReferenceに参照を格納する。
- 適切に構築されたオブジェクトの最終フィールドにそれへの参照を格納する。または
- ロックによって適切に保護されているフィールドに参照を格納します。
final
リリースとあなたの不変オブジェクトの
宣言フィールドこの制限(すなわち、それは他のスレッドはオブジェクトへの参照を見れば、彼らはまた、完全に初期化された状態でそのfinal
フィールドが表示されることを保証)。ただし、一般的には、他のスレッドがオブジェクトの参照を公開するとすぐに参照できることを保証していないため、安全な発行を使用してオブジェクトを確実に確保する必要があります。あなたのオブジェクトがインタフェースを実装している場合、あなたはCollections.unmodifiableList()
で使用されるアプローチを使用することができます
注意など:
class ImmutableFooWrapper implements IFoo {
private final IFoo delegate; // final provides safe publication automatically
public ImmutableFooWrapper(IFoo delegate) {
this.delegate = delegate;
}
...
}
public IFoo immutableFoo(IFoo foo) {
return new ImmutableFooWrapper(foo);
}
修飾子メソッド*修飾子メソッドをノックアウトするとどういう意味ですか?すべてのセッターから例外をスローしますか?これは[Liskov置換原則](http://en.wikipedia.org/wiki/Liskov_substitution_principle)に違反します。しかし、はい、このクラス**はスレッドセーフです**。 –
はい、ランタイム例外をスローするか、空のボディでオーバーライドしている可能性があります。私はそれがLSPに違反していることを知っています。 – pcjuzer