如何在Java中使用带有值的枚举

时间:2012-02-17 19:11:47

标签: java enums

当我尝试使用枚举存储:“=”,“>”,“<”等时,我有:

    public static enum DataValueModifier {
    EQUAL("="),
    GREATER_THAN(">"),
    GREATER_EUQAL(">="),
    LESS_THAN("<"),
    LESS_EQUAL("<="),
    APPRROXIMATE("~"),
    NOT_DETERMINED("ND");
    private String value;
    private DataValueModifier(String value) {
        this.value = value;
    }
    public String getValue() {
        return value;
    }
}

当我尝试比较字符串以查看它是否包含“=”符号时,如何使用它,我应该这样做:

if (dataValue.contains(DataValueModifier.EQUAL.getValue())) {
...
}

我明白使用枚举是更好的做法,但这看起来很傻...... 谢谢,

大卫

3 个答案:

答案 0 :(得分:4)

如果您在枚举中定义了方法boolean containedIn(String str)并导入了您感兴趣的枚举值(在本例中为EQUAL),则使用情况如下:

if (EQUAL.containedIn(dataValue)) {
...
}

答案 1 :(得分:2)

我喜欢在这些情况下使用static import

package mypackage;

public enum DataValueModifier
{
  //your enum code
}

...然后

import static mypackage.DataValueModifier.*;

public MyClass
{

  // code blah blah blah

  public void doIt()
  {
    // more code blah blah
    if (dataValue.contains(EQUAL.getValue())) 
    {
      //...
    }
  }
}

它更好一点。

答案 2 :(得分:2)

首先,我通过定义isModifier方法将“contains”方法(或其等价方法)移动到枚举本身。

public static enum DataValueModifier {

    ...

    public boolean isModifier( String modifierString ) 
    {
       return modifierString != null && value.equals(modifierString);
    }
}

然后,代码看起来像这样:

if (DataValueModifier.EQUAL.isModifier(dataValue)) 
{
  //...
}

但是,更重要的是,为什么你首先使用dataValue而不是枚举?如果您正在获取命令行输入或解析字符串方程式,然后需要找出表达式,我想我明白了。但是如果你能控制代码,那么你应该从枚举开始,然后你就可以说

if ( dataValueEnum == DataValueModifier.EQUAL ) {
{
  //...
}

我还考虑在枚举中添加一个静态方法,将给定的字符串转换为正确的枚举值。它可能不是那么高效,但除非你真的关心效率,否则它会让你的代码变得更加清晰。所以将这个方法添加到你的枚举:

public static DataValueModifier toDataValueModifier( String dataValue ) {
    if( EQUAL.isModifier( dataValue ) {
       return EQUAL;
    } else if( GREATER_THAN.isModifier( dataValue ) {
       return GREATER_THAN;
    } else if...
       // Do this for all possible values
    } else {
       return UNKNOWN;
       // Also, add an UNKNOWN to your list of enum values.
    }
}

isModifiertoDataValueModifier方法可能会为您的DataValueModifier枚举添加一些丑陋的代码,但所有其他代码看起来都很棒。你现在可以这样做:

DataValueModifier dataValueEnum = DataValueModifier.toDataValueModifier(dataValue);
if (dataValueEnum == DataValueModifier.EQUAL) {
   ...
}

甚至

switch( DataValueModifier.toDataValueModifier(dataValue) ) {
    case EQUAL:
        // ...
        break;
    case GREATER_THAN:
        // ...
        break;
    case GREATER_EQUAL:
        // ...
        break;
    // ... define all the cases you want
    case UNKNOWN:
    default:
         // ...
}