Java 番石榴中是否有相应的不可变枚举图?

Java 番石榴中是否有相应的不可变枚举图?,java,immutability,guava,enum-map,Java,Immutability,Guava,Enum Map,我最近了解了Java中EnumMap的优点,并希望将现有的ImmutableMap替换为EnumMap。但是,我也希望ImmutableMap提供的immutable属性 番石榴中是否有变异的、不可变的EnumMap 在存储方面,哪一个(EnumMap与ImmutableMap)性能更好 我找不到这两者的比较。如果有人能给我指一个链接或对这两种数据结构的效率给出一些见解,我将不胜感激 这里是番石榴 Guava目前没有ImmutableEnumMap变体,但如果有,它可能只是EnumMap的包装

我最近了解了Java中EnumMap的优点,并希望将现有的
ImmutableMap
替换为EnumMap。但是,我也希望ImmutableMap提供的immutable属性

  • 番石榴中是否有变异的、不可变的EnumMap
  • 在存储方面,哪一个(EnumMap与ImmutableMap)性能更好
  • 我找不到这两者的比较。如果有人能给我指一个链接或对这两种数据结构的效率给出一些见解,我将不胜感激

    • 这里是番石榴

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

      EnumMap
      在任何情况下都比基本的
      ImmutableMap
      性能更好;它很难或不可能被打败

      (不过,我将研究为枚举键类型添加一个
      ImmutableMap
      变量。)



      更新:Guava 14添加了。

      我只是想提供一个例子,现在
      ImmutableEnumMap
      已经存在,因为它是一个包私有类,所以不能执行
      ImmutableEnumMap.of()
      。您必须执行
      Maps.immutableEnumMap()

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

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

      由于guava ImmutableEnumMap在第14版时仍然标记为beta,我建议使用enum map的不可修改视图,然后丢弃对enum map的原始引用,以确保它是不可变的

      示例(在构造函数中):

      Map entries=newenummap(SomeEnum.class);
      ... // (填写条目)
      this.entries=Collections.unmodifiableMap(条目);
      
      谢谢。你能在手边比较一下这两个吗?我的意思是,没有一个明确定义的指标来比较它们,但我可以告诉你,
      ImmutableMap
      只比
      HashMap
      稍好一点,所以
      EnumMap
      应该以大约相同的因子击败这两个指标。更新:
      ImmutableEnumMap
      是的,
      ImmutableEnumMap
      现在在Guava 14.0中道歉。现在我看到我为其找到代码的ImmutableEnumMap类不是公共类,我应该使用Maps.ImmutableEnumMap(Map)。在对
      Maps.ImmutableEnumMap
      的调用中,可以使用
      ImmutableMap.builder().put(MyEnum.a,“a”).build()
      向映射添加5个以上的值。
      Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class);
      ... // (fill in entries)
      this.entries = Collections.unmodifiableMap(entries);