29

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

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

3 に答える 3

37

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

Guava には現在バリアントがありませんが、ImmutableEnumMapバリアントがある場合は、EnumMap. (とは言っても、わずかに優れた不変の実装が可能です。)

EnumMapImmutableMapいずれにせよ、基本よりも優れたパフォーマンスを発揮します。打ち負かすのは難しいか不可能です。

(ただし、enum キー型のバリアントの追加を調査するために問題を報告します。)ImmutableMap


更新: Guava 14 が追加されMaps.immutableEnumMap()ました。

于 2012-06-28T12:41:52.150 に答える
12

パッケージプライベートクラスであるためImmutableEnumMapGuava 14.0にある例を提供したかっただけなので、 ImmutableEnumMap.of(). 代わりにあなたがしなければなりませんMaps.immutableEnumMap()

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

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

于 2013-03-08T14:03:28.740 に答える
3

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

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

Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class);
... // (fill in entries)
this.entries = Collections.unmodifiableMap(entries);
于 2015-02-24T15:50:53.167 に答える