2012-06-28 17 views
22

Recentemente ho appreso dei vantaggi di EnumMap in Java e vorrei sostituire l'esistente ImmutableMap<OccupancyType, BigDecimal> in EnumMap. Tuttavia, mi piacerebbe anche la proprietà immutabile offerta da ImmutableMap.C'è un enumMap immutabile corrispondente in guava?

  • Esiste una variante ImmutableEnumMap disponibile in guava?
  • In termini di spazio di archiviazione quale uno (EnumMap vs ImmutableMap) offre prestazioni migliori?
  • Non sono riuscito a trovare un confronto tra i due. Mi piacerebbe che qualcuno mi indicasse un link o fornisse informazioni sull'efficienza delle due strutture dati?

risposta

30

Contribuente di guava qui.

Guava attualmente non ha una variante ImmutableEnumMap, ma se lo facesse, sarebbe probabilmente solo un wrapper attorno a uno EnumMap. (Ciò detto, sono possibili implementazioni immutabili leggermente migliori.)

EnumMap funzionerà meglio del valore base ImmutableMap, in ogni caso; è difficile o impossibile da battere.

(io file an issue di indagare l'aggiunta di una variante ImmutableMap per i tipi di chiave enum, però.)


Aggiornamento: Guava 14 aggiunge Maps.immutableEnumMap().

+0

Grazie. Ti capita di avere un confronto tra i due a portata di mano? – brainydexter

+1

Voglio dire, non c'è esattamente una metrica ben definita con cui confrontarli, ma posso dirvi che 'ImmutableMap' è solo leggermente migliore di' HashMap', quindi 'EnumMap' dovrebbe battere entrambi attorno allo stesso fattore. Aggiornamento –

+12

: 'ImmutableEnumMap' [è stato aggiunto.] (Http://code.google.com/p/guava-libraries/source/detail?r=835a7397fabb05a764a8008f4151c97f821a29ef) –

10

Volevo solo fornire un esempio ora che ImmutableEnumMap è in Guava 14.0, perché è una classe pacchetto-privata, quindi non è possibile eseguire ImmutableEnumMap.of(). Devi invece fare Maps.immutableEnumMap().

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

Non so se esiste una sintassi più naturale.

+2

All'interno di quella chiamata a 'Maps.immutableEnumMap' puoi usare un' ImmutableMap. builder(). Put (MyEnum.A, "A"). Build() 'per aggiungere più di 5 valori alla mappa. – drvdijk

1

Poiché il guava ImmutableEnumMap è ancora contrassegnato come beta dalla versione 14, suggerirei di utilizzare una vista non modificabile di una mappa enum e quindi di eliminare il riferimento originale alla mappa enum per garantire che sia immutabile.

Esempio (in un costruttore):

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