[英]Java design issue: enum with underlying class
我有一个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; }
添加到public Set<String> toSet() { return elements; }
public Set<String> toSet() { return elements; }
要做到这一点,主要是因为elements
不应该是公开的。
这是设计的好方法吗? 我应该做一些完全不同的事情吗? 例如
static final Set<String>
对象的类(我最不喜欢的选项) elements
作为public final
(目前是我最喜欢的选项) 我的代码已将set作为枚举成员,但是我怀疑Set<String>
替换为其他类的任何情况。
由于这是一个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()]; }
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.