web-dev-qa-db-ja.com

グアバに対応する不変のenumMapはありますか?

最近、JavaでEnumMapの利点について学び、既存のImmutableMap<OccupancyType, BigDecimal>をEnumMapに置き換えたいと思います。ただし、ImmutableMapによって提供される不変プロパティも必要です。

  • グアバで利用可能なバリアントImmutableEnumMapはありますか?
  • ストレージに関して、どちら(EnumMapとImmutableMap)の方がパフォーマンスが優れていますか?
  • 2つの比較は見つかりませんでした。誰かが私にリンクを示したり、2つのデータ構造の効率についての洞察を与えてくれたら幸いです。
26
brainydexter

グアバの寄稿者はこちら。

Guavaには現在ImmutableEnumMapバリアントがありませんが、ある場合は、おそらくEnumMapのラッパーになります。 (とはいえ、わずかに優れた不変の実装が可能です。)

いずれにしても、EnumMapは基本的なImmutableMapよりもパフォーマンスが高くなります。打ち負かすのは難しいか不可能です。

(ただし、列挙型キータイプのImmutableMapバリアントの追加を調査するために 問題を提出 します。)


更新:Guava 14は Maps.immutableEnumMap() を追加します。

32
Louis Wasserman

ImmutableEnumMapGuava 14. にあるので、例を示したかっただけです。これはパッケージプライベートクラスであるため、ImmutableEnumMap.of()を実行できないためです。代わりにMaps.immutableEnumMap()を実行する必要があります。

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

より自然な構文があるかどうかはわかりません。

11
The Alchemist

Guava ImmutableEnumMapはバージョン14の時点でまだベータとしてマークされているため、列挙型マップの変更不可能なビューを使用してから、列挙型マップへの元の参照を破棄して、不変であることを確認することをお勧めします。

例(コンストラクター内):

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