2016-09-07 6 views
3

私は、アーキテクチャのさまざまな部分からの複数のクラスが完全に置き換えられる可能性のある同じデータ構造を見たいと思う状況に遭遇しました。データ構造を維持し、十分に簡単な情報を更新すると(すべてが同じものを参照でき、見ていると最新の情報を得ることができます)、if参照は完全に再割り当てされ、他の場所には反映されません。ラッパー、その中だけ値を再割り当てすることはないアイデアを"Pointer Pointer"のJavaバージョン

public class Wrapper<T>{ 
    public T _value; 
} 

私は超汎用ラッパーのようにするために考えていました。次に、異なるコンポーネントすべてがラッパーを指すことができ、「新しい」バージョンが来たときに内部値をきれいに再割り当てできます。 (私はこれがCで **で行われたと思ったと思う)

しかし、私は以前これを見たことがないとは思う。この問題に対処するより良い方法はありますか?

+5

[ 'AtomicReference'(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicReference.html)から

String initialReference = "initial value referenced"; AtomicReference<String> atomicStringReference = new AtomicReference<String>(initialReference); String newReference = "new value referenced"; //directly update atomicReference.set(newReference); //compare and set boolean exchanged = atomicStringReference.compareAndSet(initialReference, newReference); System.out.println("exchanged: " + exchanged); exchanged = atomicStringReference.compareAndSet(initialReference, newReference); System.out.println("exchanged: " + exchanged); //get value String reference = atomicReference.get(); 

コード例良い選択かもしれないので、あなたは複数のスレッドで最新の読み取りを保証されています。 –

+0

また、更新可能なデータ構造のインスタンスに 'version'フィールドを追加することを検討してください。そうすれば、データが更新されたかどうかをオブザーバが検出できます。 –

答えて

2

AtomicReferenceを使用してください。 here

+0

私は表現しているものが厳密に不変ではない(ときどき私はそれを変更します、時にはそれを置き換えたい)ので、私は少し罪悪感を感じますが、それにつきました –

+0

@EdwardPetersだから何ですか?ポインタポインタ部分は機能します。あなたのオブジェクトが変更可能で、マルチスレッド環境で作業している場合は、そこでの並行処理も処理する必要があります。クラスの変更可能なフィールドに対してもAtomicReferenceを使用することを検討することができます。 – Bohemian

+0

@Bohemianええ、私はそれを同期させましたが、AtomicReferenceのために読んだドキュメンテーションは "不変"なので、どこかで契約を破るかもしれないと心配しています。 –

関連する問題