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

Dav*_*hao 7 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

if (dataValue.contains(DataValueModifier.EQUAL.getValue())) {
...
}
Run Code Online (Sandbox Code Playgroud)

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

大卫

Jef*_*erg 2

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

public static enum DataValueModifier {

    ...

    public boolean isModifier( String modifierString ) 
    {
       return modifierString != null && value.equals(modifierString);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您的代码如下所示:

if (DataValueModifier.EQUAL.isModifier(dataValue)) 
{
  //...
}
Run Code Online (Sandbox Code Playgroud)

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

if ( dataValueEnum == DataValueModifier.EQUAL ) {
{
  //...
}
Run Code Online (Sandbox Code Playgroud)

我还考虑向枚举添加一个静态方法,将给定的字符串转换为正确的枚举值。也许它的效率不太高,但除非您真的关心效率,否则它会让您的代码更加干净。因此,将此方法添加到您的枚举中:

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

isModifier方法toDataValueModifier可能会向您的 DataValueModifier 枚举添加一些难看的代码,但所有其他代码看起来都很棒。您现在可以执行以下操作:

DataValueModifier dataValueEnum = DataValueModifier.toDataValueModifier(dataValue);
if (dataValueEnum == DataValueModifier.EQUAL) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

甚至

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