web-dev-qa-db-fra.com

Quand utiliserais-je la méthode Java Collections singletonMap?

Je ne comprends pas pourquoi vous auriez besoin de Java Collections singletonMap ? Est-ce utile dans les applications multithread?

69
user710818

En gros, cela vous permet de faire ceci:

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

plutôt que cela:

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

ce qui est beaucoup plus agréable lorsque vous n'avez qu'une seule paire clé/valeur. Cette situation ne se produit probablement pas très souvent, mais singleton() et singletonList() peuvent assez souvent être utiles.

105
Michael Borgwardt

C'est utile si vous devez passer une carte à un code général (en tant que paramètre ou à la suite d'une méthode) et que vous savez que dans ce cas particulier - mais peut-être pas dans d'autres cas, qui transmettent une carte au même général code - la carte que vous voulez passer n'a qu'une seule clé. Dans ce cas, SingletonMap est plus efficace qu'une implémentation de carte complète et également plus pratique pour le programmeur, car tout ce que vous devez dire peut être dit dans le constructeur.

14
Henning Makholm

De plus, une implémentation SingletonMap renvoyée par Collections.singletonMap () a une empreinte mémoire inférieure à celle d'un objet HashMap. Il ne doit contenir que deux champs de membre: la clé et la valeur, alors qu'un HashMap gère un tableau interne d'objets Node plus d'autres champs de membre. Donc, si vous créez un lot de ces cartes en mémoire, il serait prudent de choisir Collections.singletonMap ().

7
gary

C'est principalement pour la commodité et l'abstraction. Certaines API prennent comme argument Collection et il est agréable d'avoir un moyen simple de convertir des objets en Set ou Map.

singletonMap() et singletonList() ont été introduits après singletonSet() dans Java 1.3 car singletonSet() s’est avéré utile.

4
tskuzzy

beaucoup de réponses vous ont dit quand, mais je tiens à préciser quand not use it

ne l'utilisez pas si vous voulez put items later on

car la mise en oeuvre de singletonMap lancera UnsupportedOperationException

2
Basheer AL-MOMANI

Ceci est juste un autre exemple, mais j'ai écrit cette ligne de code:

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

notez le @Override. L'interface plus généralement peut prendre des cartes de beaucoup de choses; cette instanciation particulière renvoie toujours une carte contenant une chose. Notez également que la clé de la carte est un enum. Ainsi, les cartes ne sont jamais censées être grandes, elles sont simplement supposées contenir les résultats des actions spécifiées. Dans mon exemple réel, il y a jusqu'à 5 actions, et cette instanciation n'en utilise qu'une.

Pour être complet, EnumSet ou EnumMap est souvent approprié dans ces cas-là, mais ceux-ci sont encore énervants par rapport au code ci-dessus.

0
djechlin