在Java中比较枚举

时间:2014-11-10 23:11:14

标签: java enums

我有一个带枚举类型的DTO。我想测试DTO领域,但不知道我该怎么做。

Class MyDto {
  public enum ExamResult { PASS, FAIL };
  private ExamResult result;
  ...
}

我正在尝试在其他类

中测试结果字段
if(myDto.result.equals("PASS")) {
  //doSomething
} else {
  //doOtherthing
}

但是.equals()总是让我虚假,即使它有正确的价值。所以不确定我该如何测试它。

3 个答案:

答案 0 :(得分:4)

比较相等Enums值时,就好像它们是整数一样。那里 - 您应该使用==运算符。虽然equals(ExamResult.PASS)也可以在评论中提到的正常工作(但这并不经常使用)。

if(myDto.result == ExamResult.PASS) {
  //Do something
} else {
  //Do other thing
}

如果您只能访问String代表Enum的{​​{1}}代码,则可以使用此类代码:(但我不推荐)

if(myDto.result.getName().equals("PASS")) {
  //Do something
} else {
  //Do other thing
}

更多解释: Enum值在编译时被赋予唯一的整数值。在Java语言中,Enum值保证在名称和编译时间编号中是唯一的。您可以使用ordinal()方法获取Enum唯一编号。可以使用values()方法将Enums的值作为数组表示形式获取。可以使用name()方法将Enum值的名称作为String表示形式获取。

答案 1 :(得分:2)

可以测试与==运算符的相等性。虽然枚举常量是对象,但每个实例只有一个实例。

JLS 8.9: Enum constants: 因为每个枚举常量只有一个实例,所以当比较两个对象引用时,如果知道至少有一个,则允许使用==运算符代替equals方法它们指的是枚举常量。

    if ( ExamResult.PASS == myDto.result ) {
         // Do something
    }

您也可以使用equals()方法测试是否相等。 (如果变量为null,则使用左侧的常量可以避免NullPointerException。)

    if ( ExamResult.PASS.equals( myDto.result )) {
         // Do something
    }

您还可以与枚举常量的名称进行比较,该常量通过name()方法访问。

    if ( myDto.result.name().equals( "PASS")) {
         // Do something
    }

最后,您还可以在switch语句中使用枚举。有两个以上的枚举常量,这可能更简洁。

    switch ( myDto.result ) {
    case PASS:
        // Do something
        break;

    case FAIL:
    default:
        // Do something
        break;
    }

答案 2 :(得分:2)

Java枚举可以声明自己的变量和方法(可以被各个常量覆盖)。

除了@ AndyThomas'中列出的选项。回答,您可以考虑在常量本身内移动与每个常量相关的实际逻辑(考虑策略模式)。

这允许您在需要时在应用程序的其他位置重用该逻辑,而无需使用纯OOP样式的辅助实用程序方法。这是一个非常复杂的例子,说明你可以做什么(只是为了了解可能的事情):

enum ExamResult {
    PASS(true) {
        // override the default behavior to do something else
        @Override public void doSomething() {
            super.doSomething();
            System.out.println("whatever");
        }
    },
    FAIL(false);

    private final boolean success;

    ExamResult(boolean success) { this.success = success }

    // you can declare this as abstract if there's no default behavior
    public void doSomething() {
        System.out.println("Success: " + success);
    }
}

现在,您的代码变为:

myDto.result.doSomething();  // of course you need to make sure result is not null

如果您有一个持有考试结果的字符串:

ExamResult.valueOf(yourString).soSomething();