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