2013-05-11 18 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

相关问题