来自 Guava 或 Java 枚举的 ImmutableSet

问题描述 投票:0回答:3

我在here读到了一个关于使用Guava

ImmutableSet
的很好的例子。为了完整起见,在此报告该示例:

public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
  "red",
  "orange",
  "yellow",
  "green",
  "blue",
  "purple");

class Foo {
  Set<Bar> bars;
  Foo(Set<Bar> bars) {
    this.bars = ImmutableSet.copyOf(bars); // defensive copy!
  }
}

问题是,我可以使用 Java 枚举获得相同的结果吗?

PS:这个问题让我的头脑更加混乱!

java enums guava
3个回答
10
投票

使用 Java 枚举可以获得相同的结果吗?

是的,可以。你尝试过吗?

仅供参考,还有

ImmutableSet
的专门版本,它保存枚举的常量 -
Sets.immutableEnumSet
(内部使用
EnumSet
)。

一些示例(释义 Wiki 示例):

public class Test {

  enum Color {
    RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE;
  }

  static class Baz {
    ImmutableSet<Color> colors;

    Baz(Set<Color> colors) {
      this.colors = Sets.immutableEnumSet(colors); // preserves enum constants 
                                                   // order, not insertion order!
    }
  }

  public static void main(String[] args) {
    ImmutableSet<Color> colorsInInsertionOrder = ImmutableSet.of(
        Color.GREEN, Color.YELLOW, Color.RED);
    System.out.println(colorsInInsertionOrder); // [GREEN, YELLOW, RED]
    Baz baz = new Baz(colorsInInsertionOrder);
    System.out.println(baz.colors); // [RED, YELLOW, GREEN]
  }
}

编辑(OP评论后):

你想要 ImmutableSet 中的所有枚举常量吗?只要这样做:

Sets.immutableEnumSet(EnumSet.allOf(Color.class));

3
投票

不,不完全是。比较

public enum Color {
    RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE;
}

Set<Color> colors = EnumSet.allOf(Color.class);

Set<String> colors = ImmutableSet.of(
  "red", "orange", "yellow", "green", "blue", "purple"
);

由于 Java 是静态类型的,因此在第一个示例中将有一个

Set<Color>
,在后一个示例中将有一个
Set<String>

编辑1

另一个区别是,您可以在运行时创建任意大小的

ImmutableSet
(前提是没有单个元素
equals()
任何其他元素)。相反,也可以在运行时创建
EnumSet
,但它包含的元素永远不能多于枚举值的数量。

编辑2

ImmutableSet
可以包含不同类的元素,只要它们实现相同的接口即可。
EnumSet
只能包含枚举类型。


0
投票

如果您没有所有这些花哨的实用程序库作为依赖项,您可以使用标准方式:

enum Furniture{SOFA, CHAIR, TABLE};
Set<Furniture> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(Furniture.values())));

顺便说一句:这不是最有效的方法吗?我在这些库的方法中看到了很多代码,可能是多余的?无论如何,这取决于上下文。我的方法有点冗长,并且没有做一些优化,例如缓存等,但它是独立的,并且正是OP所要求的。

© www.soinside.com 2019 - 2024. All rights reserved.