3

我在这里读到了一个关于使用ImmutableSetGuava的好例子。为了完整起见,此处报告示例:

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:这个问题让我的脑子更乱了!

4

3 回答 3

9

我可以使用 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));
于 2013-04-11T15:10:28.940 回答
2

不,不完全是。相比

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>在第一个示例中使用 a Set<String>,在后一个示例中使用 a。

编辑 1

另一个区别是您可以ImmutableSet在运行时创建任意大小的(前提是没有equals()任何其他元素的单个元素)。相反,anEnumSet也可以在运行时创建,但它包含的元素永远不能超过枚举值的数量。

编辑 2

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

于 2013-04-11T15:20:34.740 回答
0

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

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

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

于 2017-10-20T11:51:34.537 回答