2012-06-28 20 views
22

Hace poco aprendí sobre los beneficios de EnumMap en Java y me gustaría reemplazar el existente ImmutableMap<OccupancyType, BigDecimal> por EnumMap. Sin embargo, también me gustaría la propiedad inmutable ofrecida por ImmutableMap.¿Existe un enumMap inmutable correspondiente en guayaba?

  • ¿Hay alguna variante, ImmutableEnumMap disponible en guayaba?
  • En términos de almacenamiento, ¿cuál (EnumMap vs ImmutableMap) tiene mejor rendimiento?
  • No pude encontrar una comparación de los dos. Agradecería que alguien me señale un enlace o me dé algunas ideas sobre la eficiencia de las dos estructuras de datos.

Respuesta

30

Contribuyente de guayaba aquí.

Guava no tiene actualmente una variante ImmutableEnumMap, pero si lo hiciera, probablemente sería simplemente un contenedor alrededor de EnumMap. (Dicho esto, son posibles implementaciones inmutables ligeramente mejores).

EnumMap tendrá un mejor rendimiento que el ImmutableMap básico, en cualquier caso; es difícil o imposible de superar.

(Voy a file an issue para investigar la adición de una variante ImmutableMap para este tipo de clave de enumeración, sin embargo.)


Actualización: 14 Guayaba añade Maps.immutableEnumMap().

+0

Gracias. ¿Tendría una comparación de los dos a mano? – brainydexter

+1

Quiero decir, no hay exactamente una métrica bien definida para compararlos, pero puedo decirles que 'ImmutableMap' es solo un poco mejor que' HashMap', por lo que 'EnumMap' debería vencer a ambos por el mismo factor. –

+12

Actualización: 'ImmutableEnumMap' [se ha agregado.] (Http://code.google.com/p/guava-libraries/source/detail?r=835a7397fabb05a764a8008f4151c97f821a29ef) –

10

Solo quería dar un ejemplo ahora que ImmutableEnumMap está en Guava 14.0, porque es una clase de paquete privado, por lo que no puede hacer ImmutableEnumMap.of(). Tienes que hacer Maps.immutableEnumMap() en su lugar.

private final ImmutableMap<MyEnum, String> myEnumMap = Maps.immutableEnumMap(ImmutableMap.of(
     MyEnum.A, "A", 
     MyEnum.B, "B", 
     MyEnum.C, "C" 
     )); 

No estoy seguro si hay una sintaxis más natural.

+2

Dentro de esa llamada a 'Maps.immutableEnumMap' puede utilizar un' ImmutableMap constructor() puesto.. (MyEnum.A, "a"). build() 'para añadir más de 5 valores al mapa. – drvdijk

1

Como la guava ImmutableEnumMap aún está marcada como beta a partir de la versión 14, sugeriría utilizar una vista no modificable de un mapa enum y luego tirar la referencia original al mapa enum para asegurar que sea inmutable.

Ejemplo (en un constructor):

Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class); 
... // (fill in entries) 
this.entries = Collections.unmodifiableMap(entries);