java immutability guava enum-map

java - ¿Existe un enumMap inmutable correspondiente en la guayaba?



immutability guava (3)

Recientemente aprendí sobre los beneficios de EnumMap en Java y me gustaría reemplazar el ImmutableMap<OccupancyType, BigDecimal> por EnumMap. Sin embargo, también me gustaría la propiedad inmutable ofrecida por ImmutableMap.

  • ¿Existe una variante, ImmutableEnumMap disponible en guava?
  • En términos de almacenamiento, ¿cuál (EnumMap vs ImmutableMap) se desempeña mejor?
  • No pude encontrar una comparación de los dos. ¿Apreciaría si alguien me puede señalar un enlace o dar algunas ideas sobre la eficiencia de las dos estructuras de datos?

Contribuidor de guayaba aquí.

Guava actualmente no tiene una variante de ImmutableEnumMap , pero si la tuviera, probablemente solo sería una envoltura alrededor de un EnumMap . (Dicho esto, son posibles implementaciones un poco mejores e inmutables.)

En cualquier caso, EnumMap funcionará mejor que el EnumMap básico; Es difícil o imposible de superar.

(Sin embargo, presentaré un problema para investigar la adición de una variante de ImmutableMap para los tipos de clave de enumeración).

Actualización: Guava 14 agrega Maps.immutableEnumMap() .


Dado que la guava ImmutableEnumMap aún está marcada como beta en la versión 14, sugeriría usar una vista no modificable de un mapa de enumeración y luego descartar la referencia original al mapa de enumeración para garantizar que sea inmutable.

Ejemplo (en un constructor):

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


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 se puede hacer ImmutableEnumMap.of() . Tienes que hacer Maps.immutableEnumMap() 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.