簡體   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