繁体   English   中英

Java设计问题:基础类的枚举

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM