web-dev-qa-db-ja.com

いつJava Collections singletonMapメソッドを使用しますか?

Javaコレクション singletonMap ?が必要な理由がわかりません。マルチスレッドアプリケーションで役立ちますか?

75
user710818

基本的に、これを行うことができます:

_callAPIThatTakesAMap(Collections.singletonMap(key, value));
_

これよりも:

_Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);
_

キーと値のペアが1つしかない場合は、はるかに優れています。この状況はおそらくそれほど頻繁には発生しませんが、singleton()およびsingletonList()は非常に頻繁に役立つ可能性があります。

113

(パラメーターとして、またはメソッドの結果として)一般コードにマップを渡す必要があり、この特定のケースでそれを知っている場合に便利ですが、おそらく同じ一般にマップを渡す他のケースではそうではありませんコード-渡したいマップにはキーが1つしかありません。その場合、SingletonMapは本格的なマップ実装よりも効率的であり、プログラマーにとっても必要なことはすべてコンストラクターで言うことができるため、プログラマーにとっても便利です。

14
Henning Makholm

また、Collections.singletonMap()によって返されるSingletonMap実装のメモリフットプリントは、通常のHashMapよりも小さくなります。 HashMapは、Nodeオブジェクトと他のメンバーフィールドの内部配列を維持します。一方、メモリ内のこれらのマップの多く、Collections.singletonMap()を使用するのが賢明な選択です。

7
gary

主に利便性と抽象化のためです。一部のAPIはCollectionを引数として使用し、オブジェクトをSetまたはMapに変換する簡単な方法があると便利です。

singletonMap()singletonList()は、singletonSet() in Java 1.3の後に実際に導入されたのは、singletonSet()が有用であることが判明したためです。 。

4
tskuzzy

多くの答えがいつあなたに言ったが、私はnot use it

使用しないでくださいput items later on

singletonMapのput実装はUnsupportedOperationExceptionをスローするため

2

これは単なる別の例ですが、次のコード行を書きました。

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}

@Override。より一般的には、インターフェースは多くのもののマップを取得できます。この特定のインスタンス化は、常に1つのものを含むマップを返します。また、マップのキーはEnumであることに注意してください。したがって、マップが大きくなることは想定されておらず、指定されたアクションの結果が含まれているだけです。私の実際の例では、最大5つのアクションがあり、このインスタンス化はそのうちの1つのみを使用します。

完全にするには、これらの場合にEnumSetまたはEnumMapが適切であることがよくありますが、上記のコードと比較すると、それらはいらいらするほど冗長です。

0
djechlin