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