比较Java枚举值

rip*_*234 44 java enums

有没有办法检查枚举值是否与另一个值"更大/相等"?

我想检查错误级别是"错误还是以上".

Chr*_*est 54

所有Java枚举都实现了Comparable:http://java.sun.com/javase/6/docs/api/java/lang/Enum.html

您也可以使用该ordinal方法将它们转换为ints,然后进行比较是微不足道的.

if (ErrorLevel.ERROR.compareTo(someOtherLevel) <= 0) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 来自http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#compareTo%28E%29的带回家消息是:**"此方法实现的自然顺序是声明常量的顺序为"**.因此*enum {TRACE,DEBUG,INFO,WARN}*表示:TRACE <DEBUG <INFO <WARN. (12认同)
  • @ ripper234:你的问题是"enum" (4认同)

Fel*_*ers 26

一个更具表现力的版本将是

myError.isErrorOrAbove(otherError)
Run Code Online (Sandbox Code Playgroud)

要么

myError.isWorseThan(otherError)
Run Code Online (Sandbox Code Playgroud)

这样,您可以在Enum中定义排序,并可以根据需要在内部更改实现.现在,Enum的客户端可以在不知道任何细节的情况下比较值.

可能的实施方式

public enum ErrorLevel {

    INFO(0),
    WARN(1),
    ERROR(2),
    FATAL(3);

    private Integer severity;

    ErrorLevel(int severity) {
        this.severity = severity;
    }

    public boolean isWorseThan(ErrorLevel other) {
        return this.severity > other.severity;
    }
}
Run Code Online (Sandbox Code Playgroud)

我也不建议使用ordinal()方法进行比较,因为当某人更改顺序时,Enum值被定义,您可能会遇到意外行为.

  • 同意.依靠序数位置是一个巨大的错误,可能会导致一些非常难以追踪的错误. (3认同)

Ric*_*ler 8

假设您已按严重性顺序定义它们,则可以比较每个值的序数.序数是它在枚举声明中的位置,其中初始常量的序数为零.

您可以通过调用值的ordinal()方法获得序数.


Pet*_*rey 5

我想检查错误级别是"错误还是以上".

这样的枚举应该具有与之相关的级别.因此,要找到等于或大于等于你应该比较的水平.

使用序数依赖于枚举值出现的顺序.如果你依赖于此,你应该记录它,否则这样的依赖会导致代码脆弱.


Max*_*oom 5

Java 枚举已经构建了compareTo(..)方法,该方法使用枚举位置(也称为序数)将一个对象与另一个对象进行比较.该位置是根据枚举常量的声明顺序确定的,其中第一个常量的顺序为零.
如果这种安排不合适,您可能需要通过添加内部字段来定义自己的比较器,如下所示:

import java.util.Comparator;

public enum Day {
  MONDAY(1, 3),
  TUESDAY(2, 6),
  WEDNESDAY(3, 5),
  THURSDAY(4, 4),
  FRIDAY(5, 2),
  SATURDAY(6, 1),
  SUNDAY(0, 0);

  private final int calendarPosition;
  private final int workLevel;

  Day(int position, int level) {
    calendarPosition = position;
    workLevel = level;
  }

  int getCalendarPosition(){ return calendarPosition; }  
  int getWorkLevel() { return workLevel;  }

  public static Comparator<Day> calendarPositionComparator = new Comparator<Day>() {
    public int compare(Day d1, Day d2) {
      return d1.getCalendarPosition() - d2.getCalendarPosition();
    }
  };

  public static Comparator<Day> workLevelComparator = new Comparator<Day>() {
    public int compare(Day d1, Day d2) {
      // descending order, harder first
      return d2.getWorkLevel() - d1.getWorkLevel();
    }
  };        
}
Run Code Online (Sandbox Code Playgroud)

驱动程序检查是否所有工作:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class EnumTest
{
  public static void main (String[] args) {
     List<Day> allDays = Arrays.asList(Day.values());
     System.out.println("===\nListing days in order of calendar position:");
     Collections.sort(allDays, Day.calendarPositionComparator);
     showItems(allDays);
     System.out.println("===\nListing days in order of work level:");
     Collections.sort(allDays, Day.workLevelComparator);
     showItems(allDays);
  }

  public static void showItems(List<Day> days) {
    for (Day day : days) {
      System.out.println(day.name());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)