Java设计问题:具有底层类的枚举

时间:2014-10-01 22:14:49

标签: java enums

我有一个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 finalSet<String>(我现在最喜欢的选项)

我的代码设置为枚举成员,但我怀疑是否有{{1}}替换为其他类的任何情况。

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()]; }
...