単一リンクリストを作成することにし、内部リンクノード構造を不変にする計画を立てました。
しかし、私は思わぬ障害に遭遇しました。次のリンクされたノード(以前のadd
操作から)があるとします。
1 -> 2 -> 3 -> 4
を追加したいと言います5
。
これを行うには、ノード4
は不変なので、の新しいコピーを作成する必要があります4
が、そのnext
フィールドをを含む新しいノードに置き換えます5
。問題は3
、古いものを参照していること4
です。追加されていないもの5
。今、コピーし3
、そのnext
フィールドを置き換えて4
コピーを参照する必要がありますが、今2
は古いものを参照してい3
ます...
または、言い換えると、追加を行うには、リスト全体をコピーする必要があるようです。
私の質問:
私の考えは正しいですか?構造全体をコピーせずに追加を行う方法はありますか?
どうやら「効果的なJava」には推奨事項が含まれています。
クラスを変更可能にする非常に正当な理由がない限り、クラスは不変でなければなりません...
これは可変性の良いケースですか?
私はリスト自体について話していないので、これは提案された答えの複製ではないと思います。これは明らかに、インターフェイスに準拠するために変更可能でなければなりません(新しいリストを内部に保持し、getterを介して取得するなどの操作を行わないでください。リストの内部が不変でなければならないかどうかについて話している。
CopyOnWritexxx
マルチスレッドに使用される非常に高価なクラスのいずれかです。コレクションが実際に不変であることを期待する人はいません(ただし、いくつかの奇抜な点はありますが)