6

不変リストがある場合、たとえば、要求すると常に同じオブジェクトへの参照が返されることが期待されます。

list.get(0)

私の質問は、オブジェクトを変異させ、次にリストから取得したときにその変異を反映させることができると思いますか?

4

7 に答える 7

8

それは文脈に依存します。汎用ライブラリでは、リストが不変であると想定する必要があります。リスト内の要素への変更は、毎回同じ参照を返すことの直接的な結果として、すべての呼び出し元に反映されます。

ただし、これが特殊な不変ツリー (または何でも) であり、そのように文書化されている場合、リスト内の項目自体が不変であると予想され、それは議論の余地のある問題になります。

于 2009-04-09T09:05:33.413 に答える
2

リストの不変性についてではなく、含まれているオブジェクトの不変性についての質問です。

実際、参照型がある場合、リスト内の不変エンティティが参照です。これは、参照が常に同じであることを意味します。現在、参照されているオブジェクトが変更されるかどうかは、それがどの種類のオブジェクトであるかによってのみ異なります。オブジェクトが不変の場合 (たとえば、.NET と Java の両方の文字列、または .NET のすべての値の型など)、オブジェクトは変更できません。

それ以外の場合、オブジェクトは変更される可能性があり、同じオブジェクトへの他のすべての参照は、同じインスタンスへの参照を保持しているため、変更された状態が表示されます。したがって、最初に書いたように、これはリストから完全に独立しています (また、不変であるかどうかも関係ありません)。

于 2009-04-09T10:50:45.157 に答える
1

それは通常予想されることです。リストは不変です。つまり、リスト内のアイテムを追加または削除したり、アイテムを完全に置き換えたりすることはできません。これらのアイテムを不変にしたい場合は、自分で処理する必要があります。オブジェクトへの参照を取得すると、リストは確かにオブジェクトの状態を変更することを止めることはできません。

于 2009-04-09T09:05:23.723 に答える
1

はい。

文書化されていない限り、オブジェクトを取得したときに不変リストがそのオブジェクトを複製することは期待していません。

于 2009-04-09T10:57:24.720 に答える
1

修理工場が、これまでに訪れたすべての車の永続的な追加のみの記録を保持したいと考えているとします。これにより、所有者は、各車が入るたびに、以前に修理工場にあったかどうかを知ることができます。どちらが良いでしょう:

  1. 各車の VIN (車両識別番号) の恒久的な記録を保持します。
  2. 各車の複製を作成し (VIN は一意である必要があるため、元の VIN とは異なる必要があります)、複製された車を永続的に保管します。

車自体は変更可能なオブジェクトですが、ID車の VIN で表される値は不変です。来店時は青だった車が赤く塗装されている可能性は十分にあります。したがって、VIN から任意の車を簡単に見つけることができたとしても、車 (VIN) のリストとそれらがいつ店にあったかでは、先週の木曜日に何台の青い車が整備されたかを判断することはできません。一方、リストの目的が、入ってくる車両が以前に店舗にあったかどうかを知らせることである場合、VIN のリストはまさに必要なものです。VIN を所有する代わりに、複製された車のコレクションを持っている場合、これらすべての複製された車を作成して保管するコストは、VIN を保管するコストよりもはるかに高くなるだけでなく、

于 2012-08-14T22:37:14.000 に答える
0

はい、Javaを知っているので、「不変」であるため、List<T>Tが不変でない限り、Tが不変であるとは思いません。ただし、合理的な実装は、たとえば、毎回List<Date>コピーすることです。Date問題は、それDateが変更可能であり、他の equal と区別できることDateです。

于 2009-04-09T09:06:12.600 に答える