Javaでは、Collection.add()はブール値を返します。ブール値は、追加された要素がセットに存在しなかった場合はtrueになり、Map.put()は以前にキーに関連付けられていた値を返します(存在しない場合はnull)。
同じ方法で実装されていない理由はありますか(たとえば、両方がブール値を返す)?
私はあなたが_Map.put
_を意味していると思います-_Map.add
_がないからです。ただし、同じ名前であっても、これらのメソッドは動作が異なるため、インターフェースを統一しようとしても意味がありません。
_Collection.add
_の戻り値のドキュメント の記述方法を見てください。
呼び出しの結果、このコレクションが変更された場合はtrue
現在、コレクションが変更されない唯一の有効な理由は、セットであり、アイテムが既にそこにある場合です(他の理由でスローする必要があります)が、allコレクション。セットおよび非セットに対して特別な句を作成する必要はありません。
しかし、それは地図にとって意味がありますか?このことを考慮:
_HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 2);
map.put(2, 2);
/*case 1*/ map.put(1, 1); // value changed - would have returned `true`
/*case 2*/ map.put(2, 2); // nothing changed - would have returned `false`
/*case 3*/ map.put(3, 3); // key-value pair added - would have returned `true`
_
ケース1と3はどちらもtrue
を返しますが、非常に異なります。一方はエントリを上書きし、もう一方は新しいエントリを追加しています。それで、ケース1はfalse
を返すはずでしたか?ただし、一方がマップを変更し、もう一方は変更しない場合でも、ケース2と同じになります。
したがって、_Collection.add
_の動作を_Map.put
_にコピーしても意味がありません。 _Map.put
_の動作を_Collection.add
_にコピーしてみませんか? _Collection.add
_が古い値を返すとどうなりますか?
私はそれにいくつかの問題を見ます:
add
への引数として送信しただけです!カスタムコンパレーターを備えたTreeSet
がある場合はどうなりますか?
_TreeSet<Integer> treeSet = new TreeSet<Integer>((a, b) -> Integer.compare(a % 10, b % 10));
treeSet.add(11);
treeSet.add(21); // should this return `11` or `21`?
_
これはMap
の問題ではありません。キーで検索するため、そのキーを要求したときに取得するものを定義する必要があるためです。
これにより、コレクションは実際に値を取得します。 Collection
実装がブルームフィルターである場合はどうなりますか?クイックハッシュ照合を行う代わりに、実際にオブジェクトを探す必要があります。データベーステーブルのラッパーの場合はどうなりますか?これで、すでに持っているオブジェクトを作成する必要があります!
もちろん、Map
にも同様の問題がありますが、少なくとも古い値は重要です。それが何であるかわからず、消えてしまうからです。しかし、Collection
ではすべて費用がかかり、利益はありません...
Collection.addは、コレクションが変更されたかどうかを返します。
Map.putは、キーの前の要素を返します。
これらは単に異なる機能です。
Collectionインターフェースには「同等の」メソッドはありません。ただし、List.setがあり、その位置にある前の要素が返されます。マップはコレクションではないことに注意してください。
どちらのコレクションデザイナーも、メソッドの戻り値を使用して便利なものを提供しようとしました。 addメソッドは、アイテムがすでに存在しているかどうかを通知するだけです。これは、操作したい情報です。
地図から何が得られますか?ほとんどの情報は、キーが持っていた最後の値です。これは、アイテムがすでに存在しているかどうかと、Mapデータ構造のみが持つ別の情報、つまり最後の値の両方を示します。