2011-08-19 13 views

Respuesta

78

Básicamente, se le permite hacer esto:

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

en lugar de esto:

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

que es mucho más agradable cuando sólo tiene un único par clave/valor. Esta situación probablemente no surja con mucha frecuencia, pero singleton() y singletonList() pueden ser bastante útiles.

+7

Utilizo singletonMap todo el tiempo en DAO que usa Spring's Named Parameter JDBC Template. Si tiene una instrucción simple de selección como "select foo from bar where 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, lo que podría no ser bueno para esa API, porque puede ser que la API agregue más elementos a este mapa, y 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 debe quedar claro a partir de la documentación de la API si las entradas se agregan a un mapa pasado como parámetro. –

11

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

+0

nice explanation –

4

Es principalmente por conveniencia y abstracción. Algunas API toman como argumento Collection y es bueno tener una forma simple de convertir objetos a Set o Map.

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

+2

No hay un método singletonSet(), simplemente se llama singleton() –

0

Esto es sólo un ejemplo, pero escribió esta línea de código:

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

nota del @Override. La interfaz en 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 un Enum. Por lo tanto, se supone que los mapas no son grandes, se supone que contienen los resultados de las acciones especificadas. En mi ejemplo real, hay hasta 5 acciones, y esta instanciación solo usa una de ellas.

Para completar, EnumSet o es a menudo apropiado en estos casos, pero esos siguen siendo molestamente prolijo en comparación con el código anterior.

4

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

0

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

no lo use si quieres put items later on,

debido a la aplicación de venta de singletonMap tirará UnsupportedOperationException

Cuestiones relacionadas