2013-05-11 22 views
5

我有哪幾種常量的枚舉類,我想添加一些靜態值FOCUSED指示哪個枚舉值已集中...Enum:我做了一些不需要的事情嗎?

我找到了一種方法:

package messagesystem; 

/** 
* 
* @author Frank 
*/ 
public enum MessageType { 
    ALL, 
    GENERAL, 
    SEND, 
    RECEIVE, 
    LOG, 
    EXCEPTION, 
    DEBUG, 
    PM; 

    public final static MessageType FOCUSED = GENERAL; 

    private final String value; 

    MessageType() { 
     String firstLetter = name().substring(0, 1); 
     String otherLetters = name().substring(1, name().length()); 
     this.value = firstLetter.toUpperCase() + otherLetters.toLowerCase(); 
    } 

    @Override 
    public String toString() { 
     return value; 
    } 
} 

然而,現在我想知道:我剛剛弄亂了枚舉類嗎?因爲我不想在指定消息類型時選擇FOCUSED,但是處理枚舉MessageType的類應該能夠確定值FOCUSED ......這樣我就不需要在每個類中對它進行硬核。

任何想法表示讚賞。

編輯:它雖然表現正確。 此代碼給出了預期的輸出:

this.focused = MessageType.FOCUSED.toString(); 
    System.out.println(focused); 

輸出是「常規」。

+0

「處理MessageType枚舉的類應該能夠確定FOCUSED值」 - 這實際上並不清楚你的意思。通過你提供的代碼,'FOCUSED'的值總是*'GENERAL' – 2013-05-11 14:49:57

+0

的確如此,這個想法是,如果我想在developpemtn的後面改變'FOCUSED',那麼我只需要在一個地方改變它。與通過將其硬編碼爲'GENERAL'的每個變量模仿'FOCUSED'值相反。 – skiwi 2013-05-11 14:51:16

+0

所以你真的希望它是一個不變的 - 一個別名,幾乎? *如果*是這種情況,那很好 - 但這並不真正與「某些靜態值FOCUSED,它指示哪些枚舉值具有焦點」相同 - 因爲這聽起來像是一個* state *,它可能會有所不同。部分原因還不清楚,因爲消息類型首先關注的內容並不明顯。 – 2013-05-11 14:53:50

回答

3

FOCUSED只是GENERAL的別名。它不會出現在枚舉的values()中,並且如果某些客戶端代碼使用FOCUSED,它實際上將使用GENERAL,因爲這兩個變量都引用相同的枚舉值。所以不,我不認爲你搞砸了。

爲了減少混淆,也許你應該讓focused()成爲一個靜態方法,它返回GENERAL。這也可以避免重新編譯客戶端代碼,以防您確定重點類型是另一種類型。

+1

我想強調爲此使用靜態方法(而不是靜態最終變量)的重要性。在Java中,靜態最終常量在* compile *時間被解析。如果您更改了常量的值,則任何已編譯的類都將繼續保留舊值。 JB在這裏的建議看起來很微妙,但事實並非如此 - 這非常重要! – 2013-05-11 15:02:18

+0

@KevinDay哇,好吧,我不得不閱讀幾遍,才能完全掌握信息。但這確實是一個大問題,可能會導致嚴重的問題。感謝您指出這一點,此外,通過使其成爲一種靜態方法,我也確保我自己不能選擇'FOCUSED'作爲'MessageType'的枚舉,我認爲Netbeans仍然允許我這樣做。 – skiwi 2013-05-11 15:05:11

相關問題