No entiendo por qué necesitarías java Collections singletonMap . ¿Es útil en aplicaciones multiproceso?
No entiendo por qué necesitarías java Collections singletonMap . ¿Es útil en aplicaciones multiproceso?
Respuestas:
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.
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.
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 ().
Es principalmente por conveniencia y abstracción. Algunas API toman a Collection
como argumento y es bueno tener una forma sencilla de convertir objetos en Set
o Map
.
singletonMap()
y en singletonList()
realidad se introdujeron después singletonSet()
en Java 1.3 porque singletonSet()
resultó ser útil.
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 singletonMap
will throwUnsupportedOperationException
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, EnumSet
o a EnumMap
menudo es apropiado en estos casos, pero aún son molestos en comparación con el código anterior.
SingletonMap
así que lo edité. Desde entonces he revertido mis cambios;)