4

Guava のImmutableCollectionImmutableCollectionを関数のパラメーターとして使用する場合は、 as パラメーター型を要求することをお勧めします。

void <T> foo(ImmutableCollection<T> l)

または、関数が を取り、Collection<T>次のように不変のコレクション自体を作成する必要があります

void <T> foo(Collection<T> l)
{
    ImmutableCollection<T> l2 = ImmutableCollection.copyOf(l);

    // ...
}

呼び出し元は、関数に渡すマップが変更されていないことを確信しているため、最初のバージョンが望ましいと思われます。ただし、最初のバージョンでは、 を呼び出すコレクションを含むクライアント コードが必要ですcopyOf()。つまり、次のようになります。

Collection collection = map.values();
foo(ImmutableCollection.copyOf(collection));

// instead of simply

foo(collection);

PS: にはbutとdoImmutableCollectionがないので、これは完全に真実ではありません。copyOf()ImmutableListImmutableSet

4

5 に答える 5

3

foo関数がコレクション引数で何をすべきかによると思います。

  • fooがコレクション要素を読み取る場合はvoid <T> foo(Collection<T> l)、決定が呼び出し元に委ねられるため、好ましいです。

  • fooコレクションを何らかのオブジェクトの状態に組み込む場合は、不変のコレクションが望ましい場合があります。fooただし、これを処理するのはメソッドの責任なのか、それとも呼び出し元の責任なのかを自問する必要があります。

これに対する正しい (または「ベスト プラクティス」) 答えは 1 つではありません。ただし、パラメーターの正式な型として使用すると、場合ImmutableCollectionによっては複雑になったり、不要なコピーが発生したりする可能性があります。

于 2013-08-12T13:26:13.227 に答える