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

如何在Java中使用带有值的枚举,java,enums,Java,Enums,当我尝试使用enum存储:“=”、“>”、“时,我喜欢在这些情况下使用 package mypackage; public enum DataValueModifier { //your enum code } 然后 import static mypackage.DataValueModifier.*; public MyClass { // code blah blah blah public void doIt() { // more code blah

当我尝试使用enum存储:“=”、“>”、“时,我喜欢在这些情况下使用

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())) 
    {
      //...
    }
  }
}

更好一点。

如果您在枚举中定义了一个方法
boolean containedIn(String str)
,并导入了感兴趣的枚举值(在本例中等于),用法如下所示:

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

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

public static enum DataValueModifier {

    ...

    public boolean isModifier( String modifierString ) 
    {
       return modifierString != null && value.equals(modifierString);
    }
}
然后,您的代码看起来像这样:

if (DataValueModifier.EQUAL.isModifier(dataValue)) 
{
  //...
}
但是,更重要的是,为什么您首先要使用dataValue而不是enum?如果您要获取命令行输入或其他信息,或者解析字符串表达式,然后需要找出表达式,我想我理解。但是如果您可以控制代码,那么您应该从enum开始,您可以说

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

我也会考虑将一个静态方法添加到枚举中,它将给定的字符串转换为正确的枚举值。可能不是很有效,但是除非你真的关心效率,否则会使代码变得更干净。因此,将此方法添加到EnUM:

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.
    }
}
isModifier
toDataValueModifier
方法可能会在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:
         // ...
}

您应该像比较
DataValueModifier.EQUAL.getValue().equals(dataValue)
那样比较它,而枚举在一周中的几天(Day.MONDAY、Day.周二和on)比较好在我看来,做一个开关比较是可以的-我会像Paul在下面说的那样设置它,但除此之外,它是清楚的,看起来并不那么愚蠢…我假设dataValue是一个字符串?如果是这样,你应该能够覆盖
DataValueModifier.toString()
,只需这样做:
dataValue.contains(DataValueModifier.EQUAL)
如果您也像Paul建议的那样进行静态导入,它将变成
dataValue.contains(EQUAL)
如果您的枚举位于另一个类中,那么它是隐式静态的,请参阅。感谢大家的精彩回答,所有这些都非常有用,我选择Jeff的,因为它是一个完整的答案。您必须使用枚举名称。在本例中,我正在解析字符串,但isModifier方法没有检查代码中的“contains”
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:
         // ...
}