Javaコレクション singletonMap ?が必要な理由がわかりません。マルチスレッドアプリケーションで役立ちますか?
基本的に、これを行うことができます:
_callAPIThatTakesAMap(Collections.singletonMap(key, value));
_
これよりも:
_Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);
_
キーと値のペアが1つしかない場合は、はるかに優れています。この状況はおそらくそれほど頻繁には発生しませんが、singleton()
およびsingletonList()
は非常に頻繁に役立つ可能性があります。
(パラメーターとして、またはメソッドの結果として)一般コードにマップを渡す必要があり、この特定のケースでそれを知っている場合に便利ですが、おそらく同じ一般にマップを渡す他のケースではそうではありませんコード-渡したいマップにはキーが1つしかありません。その場合、SingletonMapは本格的なマップ実装よりも効率的であり、プログラマーにとっても必要なことはすべてコンストラクターで言うことができるため、プログラマーにとっても便利です。
また、Collections.singletonMap()によって返されるSingletonMap実装のメモリフットプリントは、通常のHashMapよりも小さくなります。 HashMapは、Nodeオブジェクトと他のメンバーフィールドの内部配列を維持します。一方、メモリ内のこれらのマップの多く、Collections.singletonMap()を使用するのが賢明な選択です。
主に利便性と抽象化のためです。一部のAPIはCollection
を引数として使用し、オブジェクトをSet
またはMap
に変換する簡単な方法があると便利です。
singletonMap()
とsingletonList()
は、singletonSet()
in Java 1.3の後に実際に導入されたのは、singletonSet()
が有用であることが判明したためです。 。
多くの答えがいつあなたに言ったが、私はnot use it
使用しないでくださいput items later on
、
singletonMap
のput実装はUnsupportedOperationException
をスローするため
これは単なる別の例ですが、次のコード行を書きました。
@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
が適切であることがよくありますが、上記のコードと比較すると、それらはいらいらするほど冗長です。