0

java.lang.utilのインターフェイスSetは、同じパッケージのCollectionとまったく同じ構造を持っています。

継承階層では、AbstractSetSetAbstractCollectionの両方のサブであり、どちらもCollectionのサブです。

Set のもう1 つの直接の子孫はSortedSetであり、 SortedSetはSetのみを拡張しています。

私が疑問に思っているのは、java.lang.util の Set の利点は何ですか?なぜそこにあるのでしょ?

何も欠けていない場合、API の現在の構造または階層に何も追加されていません。AbstractSet が Set を実装せずに AbstractCollection拡張しただけで、SortedSetがCollection を直接拡張した場合は、すべて同じになります。

私が考えることができる唯一のことは、セットが文書化の目的でそこにあるということです。

階層をさらに構造化/再構築するべきではありません。これは、子孫の構造的な変更を意味し、意味がありません。

ここで何か不足している場合は、検証または反論を探しています。

//===========================================

編集: Q は: 「Set がそこにある理由」--API の構造に何が追加されますか?

セットがコレクション間で数学的にどのように特定されるかは明らかです。

4

4 に答える 4

8

SetとのメソッドCollectionは同じシグネチャと戻り値の型を持ちますが、異なる動作規約を持ちます...セットに「同じ」要素を複数回含めることはできないという事実に由来します。それが、それらが異なるインターフェースである理由です。

それは単なるドキュメンテーションではありません。Java は「ダック タイピング」を行わないため、 と の違いはCollectionSetコンパイル時と実行時の型チェックの両方で確認できます。

そして、その区別は有用なものです。しかなかった場合、引数として重複のないコレクションを必要とCollectionするメソッドを作成することはできません。


あなたが書く:

セットは、コメントとは別に、コレクションのコピー/貼り付けです。

そんなこと知ってる。コメントは行動契約です。それらは重要です。Java 1, 2で何かがどのように動作するかを指定する他の方法はありません。

参照:


1 - 1 つまたは 2 つの言語で、言語自体で「契約」の動作面を指定できます。エッフェルは、「契約による設計」パラダイムを生み出した古典的な例です。

2 - 実際、JMLシステムは正式な事前条件、事後条件、および不変条件を Java に追加し、自動化された定理証明器を使用してそれらをチェックします。問題は、これを Java 言語の型システム / 静的型チェッカーと完全に統合するのが難しいことです。(定理証明者が「わからない」と言ったときに静的に型チェックを行うにはどうすればよいでしょうか。コード内の JML アサーションを証明/反証するほどスマートではないためです。)

于 2013-08-05T02:25:22.563 に答える
4

セットに重複する要素を含めることはできません。コレクションはできます。

于 2013-08-05T02:25:10.533 に答える
0

java.lang.util の Set の利点は何ですか? なぜそこにあるのですか?

セットを他のコレクションから分離すると、セットのみを渡すことができるようにコードを記述できます。これが役立つ例を次に示します。

public void sendMessageTo(Collection<String> addresses) {
    addresses.add("admin@example.com"); //The admin might now be on the list twice, and gets two emails, oops :(
    //do something
}

Set を取るようにインターフェイスを変更したい:

public void sendMessageTo(Set<String> addresses) {
    addresses.add("admin@example.com"); //This will add the admin if they were not already on the list, otherwise it won't because Sets don't allow duplicates
    //do something
}
于 2013-08-05T04:24:42.020 に答える
0

Setは、重複Collectionを含まない です。ページからの詳細については:

より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。その名前が示すように、このインターフェイスは数学的集合の抽象化をモデル化します。

Set インターフェースは、 Collection インターフェースから継承されたものを超えて、すべてのコンストラクターのコントラクトと、add、equals、および hashCode メソッドのコントラクトに追加の規定を配置します。便宜上、他の継承されたメソッドの宣言もここに含まれています。(これらの宣言に付随する仕様は Set インターフェースに合わせて調整されていますが、追加の規定は含まれていません。)

コンストラクターに関する追加の規定は、驚くことではありませんが、すべてのコンストラクターは重複する要素を含まないセットを作成する必要があるということです (上記で定義されているように)。

が存在しない場合Set、 で一意性を強制する方法はありませんCollection。コードが と同じであることは問題ではなく、動作制限を強制するためCollectionに存在します。定義された動作のために、がの場合、実装クラスはその動作契約を遵守する必要があります。SetSetimplemented

于 2013-08-05T02:25:51.130 に答える