gpt4 book ai didi

Java 设计问题 : enum with underlying class

转载 作者:行者123 更新时间:2023-11-29 03:16:41 25 4
gpt4 key购买 nike

我有一个 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不应公开。

这样设计好吗?我应该做一些完全不同的事情吗?例如

  • 和一群static final Set<String>一起上课对象(我最不喜欢的选项)
  • elements作为public final (我现在最喜欢的选择)

我的代码将集合设置为枚举成员,但我的疑问与 Set<String> 的任何情况有关被其他一些类取代。

最佳答案

因为它是一个枚举,所以将元素作为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()]; }
...

关于Java 设计问题 : enum with underlying class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26151579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com