2012-06-28 14 views
22

Son zamanlarda EnumMap'in Java'daki avantajlarını öğrendim ve mevcut ImmutableMap<OccupancyType, BigDecimal>'u EnumMap ile değiştirmek istiyorum. Ancak, ImmutableMap tarafından sunulan immutable özelliği de beğenirim.Guava'da karşılık gelen bir immutable enumMap var mı?

  • Guava'da bir varyant var mı, ImmutableEnumMap var mı?
  • Depolama alanı açısından (EnumMap ile ImmutableMap) hangisi daha iyi performans gösteriyor?
  • İkisinin bir mukayesesini bulamadım. Birisi beni bir linke yönlendirebilir mi ya da iki veri yapısının verimliliği hakkında biraz bilgi verebilir mi?

cevap

30

Guava katkıları burada.

Guava şu anda bir ImmutableEnumMap varyantına sahip değil, ancak eğer varsa, muhtemelen sadece EnumMap civarında bir ambalaj olacaktır. (Bu, biraz daha iyi değiştirilemez uygulamalar mümkündür.)

EnumMap, her durumda temel ImmutableMap'dan daha iyi performans gösterecektir; yenmek zor ya da imkansız.

(Ben olacak file an issue olsa enum anahtar türleri için bir ImmutableMap varyantı ekleyerek araştırmak.)


Güncelleme: Guava 14 Maps.immutableEnumMap() ekler.

+0

teşekkür ederiz. Bu iki kullanışlı bir karşılaştırma yapmak ister misiniz? – brainydexter

+1

Yani, onları karşılaştırmak için tam olarak tanımlanmış bir metrik yok, ama size şunu söyleyebilirim: 'ImmutableMap', 'HashMap' den biraz daha iyi, yani EnumMap'in her ikisini de aynı faktörle yenmesi gerek. –

+12

Güncelleme: 'ImmutableEnumMap' [eklenmiştir.] (Http://code.google.com/p/guava-libraries/source/detail?r=835a7397fabb05a764a8008f4151c97f821a29ef) –

10

Şimdi bir örnek vermek istedim, ImmutableEnumMapGuava 14.0, paket özel sınıf çünkü ImmutableEnumMap.of() yapamazsınız. Bunun yerine Maps.immutableEnumMap() yapmalısınız. Daha doğal bir sözdizimi olduğundan emin değil.

+2

Bu çağrı içinde "Maps.immutableEnumMap" için bir "ImmutableMap" kullanabilirsiniz. builder(). (MyEnum.A, "A"). Haritaya 5'ten fazla değer eklemek için build() '. – drvdijk

1

guava ImmutableEnumMap sürüm 14 itibariyle hala beta olarak işaretlendiğinden, bir enum haritasının değiştirilemeyen bir görünümünü kullanmak ve sonra orijinal referansı enum haritasına atmayı immutable olduğundan emin olmak için atmanızı öneririm. (Bir kurucu olarak)

Örnek:

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