¿Cuándo usaría el método java Collections singletonMap?

81

No entiendo por qué necesitarías java Collections singletonMap . ¿Es útil en aplicaciones multiproceso?

usuario710818
fuente
3
@skaffman: Eso sería mi culpa. Al principio pensé que el OP se refería a la clase Commons, SingletonMapasí que lo edité. Desde entonces he revertido mis cambios;)
tskuzzy

Respuestas:

121

Básicamente, te permite hacer esto:

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

En vez de esto:

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

que es mucho mejor cuando solo tiene un par clave / valor. Esta situación probablemente no se presenta muy a menudo, pero singleton()y singletonList()bastante frecuencia puede ser útil.

Michael Borgwardt
fuente
12
Utilizo singletonMap todo el tiempo en DAO que usan la plantilla JDBC de parámetro con nombre de Spring. Si tiene una declaración de selección simple como "seleccionar foo de la barra donde id =: barId", entonces necesitaría un mapa de parámetros con un solo par clave-valor, barId = 123. Ese es un gran lugar para usar singletonMap ().
spaaarky21
1
Si alguna API toma el mapa como entrada y estoy usando Collections.singleton (clave, valor), entonces estoy pasando un mapa inmutable, que podría no ser bueno para esa API, porque puede ser que la API agregue más elementos a este mapa, y en En este caso, no se puede hacer nada ya que es inmutable.
AKS
2
@AKS: en teoría sí, pero en la práctica el acceso de solo lectura es mucho más común, y debería quedar claro en la documentación de la API si las entradas se agregan a un mapa pasado como parámetro.
Michael Borgwardt
@PlabonDutta: No. Lo que podría haber sabido probándolo, mirando los documentos de la API o simplemente pensando en lo que significa "singleton".
Michael Borgwardt
15

Es útil si necesita pasar un mapa a algún código general (como un parámetro o como resultado de un método) y lo sabe en este caso particular, pero quizás no en otros casos que pasan el mapa al mismo código general. código: el mapa que desea pasar solo tiene una clave. En ese caso, SingletonMap es más eficiente que una implementación de mapa completa, y también más conveniente para el programador porque todo lo que necesita decir se puede decir en el constructor.

hmakholm dejó a Monica
fuente
8

Además, una implementación de SingletonMap devuelta por Collections.singletonMap () tiene una huella de memoria más pequeña que un HashMap normal. Solo tiene que contener dos campos miembros: la clave y el valor, mientras que un HashMap mantiene una matriz interna de objetos Node más otros campos miembros. Entonces, si está creando muchos de estos mapas en la memoria, sería una opción prudente utilizar Collections.singletonMap ().

Gary
fuente
4

Es principalmente por conveniencia y abstracción. Algunas API toman a Collectioncomo argumento y es bueno tener una forma sencilla de convertir objetos en Seto Map.

singletonMap()y en singletonList()realidad se introdujeron después singletonSet()en Java 1.3 porque singletonSet()resultó ser útil.

tskuzzy
fuente
2
No hay un método singletonSet (), solo se llama singleton ()
Michael Borgwardt
2

muchas respuestas te dijeron cuándo, pero quiero señalar cuándo not use it

no lo uses si quieres put items later on,

porque poner implementación de singletonMapwill throwUnsupportedOperationException

Basheer AL-MOMANI
fuente
0

Este es solo otro ejemplo, pero escribí esta línea de código:

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

tenga en cuenta el @Override. La interfaz de manera más general puede tomar mapas de muchas cosas; esta instanciación particular siempre devuelve un mapa que contiene una cosa. También tenga en cuenta que la clave del mapa es una enumeración. Por lo tanto, se supone que los mapas nunca deben ser grandes, solo se supone que deben contener los resultados de las acciones que se especifiquen. En mi ejemplo real, hay hasta 5 acciones, y esta instanciación solo usa una de ellas.

Para ser completo, EnumSeto a EnumMapmenudo es apropiado en estos casos, pero aún son molestos en comparación con el código anterior.

djechlin
fuente