【问题标题】:Is there a corresponding immutable enumMap in guava?番石榴中是否有对应的不可变枚举映射?
【发布时间】:2012-06-28 12:14:08
【问题描述】:

我最近了解了 Java 中 EnumMap 的好处,并想将现有的 ImmutableMap<OccupancyType, BigDecimal> 替换为 EnumMap。不过,我也喜欢 ImmutableMap 提供的不可变属性。

  • guava 中是否有变体 ImmutableEnumMap 可用?
  • 在存储方面,哪个(EnumMap 与 ImmutableMap)性能更好?
  • 我找不到两者的比较。如果有人能指出一个链接或就这两种数据结构的效率提供一些见解,我将不胜感激?

【问题讨论】:

    标签: java immutability guava enum-map


    【解决方案1】:

    Guava 贡献者在这里。

    Guava 目前没有ImmutableEnumMap 变体,但如果有,它可能只是EnumMap 的包装。 (也就是说,更好的不可变实现是可能的。)

    EnumMap 无论如何都会比基本的ImmutableMap 表现更好;很难或不可能击败。

    (不过,我将file an issue 研究为枚举键类型添加ImmutableMap 变体。)


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

    【讨论】:

    • 谢谢。你会碰巧对这两者进行比较吗?
    • 我的意思是,没有一个明确的指标可以用来比较它们,但我可以告诉你ImmutableMap 只比HashMap 好一点,所以EnumMap 应该击败两者几乎相同的因素。
    • 更新:ImmutableEnumMaphas been added.
    • 是的,ImmutableEnumMap 现在在 Guava 14.0 中。 =)
    • 道歉。我现在看到我找到代码的 ImmutableEnumMap 类不是公开的,我应该使用 Maps.immutableEnumMap(Map)。
    【解决方案2】:

    我只是想提供一个例子,现在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"
            ));
    

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

    【讨论】:

    • 在对Maps.immutableEnumMap 的调用中,您可以使用ImmutableMap.&lt;MyEnum, String&gt;builder().put(MyEnum.A, "A").build() 向地图添加5 个以上的值。
    【解决方案3】:

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

    示例(在构造函数中):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多