番石榴中是否有相应的不可变enumMap?

时间:2012-06-28 12:14:09

标签: java immutability guava enum-map

我最近了解了EnumMap在Java中的优点,并希望将现有的ImmutableMap<OccupancyType, BigDecimal>替换为EnumMap。但是,我也喜欢ImmutableMap提供的不可变属性。

  • guava中是否有变体,ImmutableEnumMap?
  • 在存储方面哪一个(EnumMap与ImmutableMap)表现更好?
  • 我无法找到两者的比较。如果有人能指出我的链接或对两种数据结构的效率有一些见解,我会很感激吗?

3 个答案:

答案 0 :(得分:32)

番石榴贡献者。

Guava目前没有ImmutableEnumMap变体,但如果确实如此,它可能只是EnumMap的包装器。 (也就是说,稍微好一点的不可变实现是可能的。)

无论如何,

EnumMap的效果会优于基本ImmutableMap;很难或不可能击败。

(我会file an issue调查为枚举密钥类型添加ImmutableMap变体。)


更新:Guava 14添加了Maps.immutableEnumMap()

答案 1 :(得分:11)

由于ImmutableEnumMap位于Guava 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"
        ));

不确定是否有更自然的语法。

答案 2 :(得分:1)

由于版本14中guava ImmutableEnumMap仍然标记为beta,我建议使用枚举映射的不可修改视图,然后丢弃对枚举映射的原始引用以确保它是不可变的。

示例(在构造函数中):

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