我最近了解了 EnumMap 在 Java 中的好处,并想将现有的 EnumMap 替换ImmutableMap<OccupancyType, BigDecimal>
为 EnumMap。但是,我也喜欢 ImmutableMap 提供的不可变属性。
- guava 中是否有变体 ImmutableEnumMap ?
- 在存储方面,哪一个(EnumMap vs ImmutableMap)表现更好?
- 我找不到两者的比较。如果有人能指出一个链接或对这两种数据结构的效率提供一些见解,我将不胜感激?
我最近了解了 EnumMap 在 Java 中的好处,并想将现有的 EnumMap 替换ImmutableMap<OccupancyType, BigDecimal>
为 EnumMap。但是,我也喜欢 ImmutableMap 提供的不可变属性。
番石榴贡献者在这里。
Guava 目前没有ImmutableEnumMap
变体,但如果有,它可能只是一个EnumMap
. (也就是说,更好的不可变实现是可能的。)
EnumMap
在任何情况下都会比基本的表现更好ImmutableMap
;很难或不可能击败。
(不过,我将提交一个问题来调查ImmutableMap
为枚举键类型添加变体。)
更新:番石榴 14 增加了Maps.immutableEnumMap()
.
我只是想提供一个现在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"
));
不确定是否有更自然的语法。
由于 guava ImmutableEnumMap 在版本 14 中仍标记为 beta,我建议使用枚举映射的不可修改视图,然后丢弃对枚举映射的原始引用以确保它是不可变的。
示例(在构造函数中):
Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class);
... // (fill in entries)
this.entries = Collections.unmodifiableMap(entries);