2017-04-06 10 views
1

コレクションの変更不可能なメソッドが基になるコレクションのビューまたはファサードを返すと仮定します。 unmodifiableListは基本的なリストの順序を使用し、unmodfiableSetは順序がないので何かを行う自由が自明であるようです。Java Collections.unmodifiableCollectionは、基礎となるコレクションの順序を保持しますか?

私はLinkedHashSetを使用していますが、順序は保持されており、基本的な順序を保持するコレクションの変更不可能なビューを公開しようとしています。 unmodifiableSetを使用すると適切ではないようですが、私はunmodifiableListを使用できません。私はunmodifiableCollectionが基本となるコレクションに任意の順序を使用することを保証することができません。

誰でもこの動作を定義する仕様に向けることができますか、それとも矛盾しますか?

+0

セットは、オブジェクト構築の一環として作成され、そのコレクションは「後で」重複したエントリに影響されない挿入順序を保持する限り、私が代わりにグアバUnmodifiableSetを使用することができます。しかし、これは、セットが構築中に作成され、決して更新されない私の特定のケースをカバーするだけです。 – JustifiedAndAncient

答えて

1

Collections.unmodifiableXXXを呼び出すと、メソッド呼び出しが変更されたときに例外をスローする単純なラッパーが作成されます。他のメソッド呼び出しはすべて基になるコレクションに行きますので、オリジナルのコレクション以外の順序やその他のものには何も影響しません。

ラッパーには状態がありません。基本的なコレクションへの参照のみがあります。

全体UnmodifiableSetラッパーは非常に小さく、(UnmodifiableCollectionから継承)イテレータが(それがremove()を上書き除く)基になるコレクションから、反復子を使用したように、反復順序が、元のコレクションと全く同じです。この場合、更なる調査に

static class UnmodifiableSet<E> extends UnmodifiableCollection<E> 
          implements Set<E>, Serializable { 
    private static final long serialVersionUID = -9215047833775013803L; 

    UnmodifiableSet(Set<? extends E> s)  {super(s);} 
    public boolean equals(Object o) {return o == this || c.equals(o);} 
    public int hashCode()   {return c.hashCode();} 
} 
+0

ありがとう@Kayamanドキュメントのすべてのクエリ操作が指定されたコレクションに読み込まれると言っているので、私がそれをしたいと思っているすべてのことを行うつもりだと確信しています。私はこのケースではクエリーに反復順序が含まれていると思いますが、真であると定義されているものがある種のドキュメントだと分かります。 LinkedHashSetは、要素の挿入順序を保持するためのリストを使用するものとして定義されていますが、その変更不可能なリストビューを作成することはできません。 – JustifiedAndAncient

+0

もちろんできません。これは 'List'ではなく、' OrderedSet'です。 – Kayaman

+0

かなり、単に挿入順を維持するために1つを使用していますが、Collections.unmodifiableOrderedSetはありませんので、SetまたはCollectionのいずれかを持っています。私に設定されているのは、暗に順序付けされていないが、実際には基礎となるコレクションの順序を完全に保つことを実際に保証している場合の数学概念を意味します。私はその保証のリファレンスドキュメントを探しているだけです。 – JustifiedAndAncient

関連する問題