我在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 枚举可以获得相同的结果吗?
是的,可以。你尝试过吗?
仅供参考,还有
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));
不,不完全是。比较
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
只能包含枚举类型。
如果您没有所有这些花哨的实用程序库作为依赖项,您可以使用标准方式:
enum Furniture{SOFA, CHAIR, TABLE};
Set<Furniture> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(Furniture.values())));
顺便说一句:这不是最有效的方法吗?我在这些库的方法中看到了很多代码,可能是多余的?无论如何,这取决于上下文。我的方法有点冗长,并且没有做一些优化,例如缓存等,但它是独立的,并且正是OP所要求的。