JavaコレクションのsingletonMapメソッドはいつ使用しますか?


81

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


3
@skaffman:それは私の悪いことだろう。最初は、OPがCommonsクラスを参照していると思ったSingletonMapので、編集しました。それ以来、変更をロールバックしました;)
tskuzzy 2011

回答:


123

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

callAPIThatTakesAMap(Collections.singletonMap(key, value));

これではなく:

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

これは、キーと値のペアが1つしかない場合に非常に便利です。このような状況は、おそらく非常に頻繁に発生しませんが、singleton()singletonList()かなり頻繁に役立ちます。


12
Springの名前付きパラメーターJDBCテンプレートを使用するDAOでは常にsingletonMapを使用しています。「selectfoofrom bar where id =:barId」のような単純なselectステートメントがある場合は、単一のキーと値のペア、barId = 123を持つパラメーターマップが必要になります。これは、singletonMap()を使用するのに最適な場所です。
spaaarky21 2012

1
APIがマップを入力として受け取り、Collections.singleton(key、value)を使用している場合、不変のマップを渡します。これは、APIがこのマップに要素を追加する可能性があるため、そのAPIには適さない可能性があります。この場合、不変であるため、何もできません。
AKS

2
@AKS:理論的にはそうですが、実際には読み取り専用アクセスの方がはるかに一般的であり、APIドキュメントから、パラメーターとして渡されたマップにエントリが追加されているかどうかを明確にする必要があります。
Michael Borgwardt

@PlabonDutta:いいえ。試してみるか、APIドキュメントを見るか、単に「シングルトン」の意味を考えることで、これを知ることができます。
Michael Borgwardt 2018年

15

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


8

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


4

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

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


2
singletonSet()メソッドはありません。単にsingleton()と呼ばれます
Michael Borgwardt 2011

2

多くの回答がいつあなたに言ったが、私はいつするべきかを指摘したい not use it

必要に応じて使用しないでくださいput items later on

の実装singletonMapがスローされるためUnsupportedOperationException


0

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

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

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

完全であるEnumSetEnumMap、これらの場合に適切であることがよくありますが、上記のコードと比較すると、依然として厄介な冗長性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.