我有一个enum
,其中每个成员都是Set<String>
,即以下是我的代码:
// Guava used only for the ease of "Sets<E>.newHashSet(E... elements)", no other
// reason.
// For pre-Java8 code, the toString() method needs to be changed.
public enum MyEnum {
MemberOne(Sets.newHashSet("this", "is", "the", "first", "member")),
MemberTwo(Sets.newHashSet("this", "is", "the", "second", "member", "and", "it",
"has", "some", "more", "words"));
private Set<String> elements;
private MyEnum(Set<String> elements) { this.elements = elements; }
public toString() {
return elements.stream().collect(Collectors.joining(", "));
}
}
我有MyEnum
因为我想在项目的其他地方只有一组非常具体的字符串,其他人不应该使用任意Set<String>
的方法。但是,我还想保留集合的功能,即我希望能够做类似的事情
if (MyEnum.MemberOne.contains("some_random_word"))
doSomethingSpecificToWordsInMemberOne();
现在,我正在考虑添加方法public Set<String> toSet() { return elements; }
来执行此操作,主要是因为elements
不应该公开。
这是一个很好的设计方法吗?我应该做一些完全不同的事吗? E.g。
static final Set<String>
个elements
个对象的类(我最不喜欢的选项)public final
为Set<String>
(我现在最喜欢的选项)我的代码设置为枚举成员,但我怀疑是否有{{1}}替换为其他类的任何情况。
答案 0 :(得分:4)
由于它是enum
,因此将元素设为public final
是有意义的。为避免出现问题,您可以确保额外的约束:
public final Set<String> elements;
private MyEnum(Set<String> elements) {
this.elements = Collections.unmodifiableSet(elements);
}
这样你仍然可以调用改变集合的方法,但是你会获得UnsupportedOperationException
。如果你想要编译时安全性,你应该桥接客户端可用的集合的方法,而不是更多。
private final Set<String> elements;
public boolean contains(String string) { return elements.contains(string); }
public String[] elements() { return elements.toArray(new String[elements.size()]; }
...