比较Java枚举值

比较Java枚举值,java,enums,Java,Enums,是否有办法检查枚举值是否与另一个值“更大/相等” 我想检查错误级别是否为“error or over”。所有Java枚举都实现了可比性: 您还可以使用ordinal方法将它们转换为ints,这样比较就很简单了 if (ErrorLevel.ERROR.compareTo(someOtherLevel) <= 0) { ... } if(ErrorLevel.ERROR.compareTo(someOtherLevel)假设您已按严重性顺序定义它们,则可以比较每个值的序号。序号是其在枚

是否有办法检查枚举值是否与另一个值“更大/相等”


我想检查错误级别是否为“error or over”。

所有Java枚举都实现了可比性:

您还可以使用
ordinal
方法将它们转换为
int
s,这样比较就很简单了

if (ErrorLevel.ERROR.compareTo(someOtherLevel) <= 0) {
  ...
}

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

通过调用值的ordinal()方法获得序号

我想检查错误级别是否为“错误或更高”

这样的枚举应该有一个与之关联的级别。因此,要找到等于或更大的级别,您应该比较这些级别


使用序号依赖于枚举值的显示顺序。如果依赖于此,则应将其记录下来,否则这种依赖性会导致代码脆弱。

另一个选项是

enum Blah {
 A(false), B(false), C(true);
 private final boolean isError;
 Blah(boolean isErr) {isError = isErr;}
 public boolean isError() { return isError; }
}
根据您的问题,我假设您使用enum来指定某种返回值,其中一些是错误状态。此实现的优点是不必在特定位置添加新的返回类型(然后调整测试值),但缺点是在初始化enum时需要额外的工作


更进一步地说,错误代码对用户来说是什么?是一种调试工具吗?如果是后者,我发现异常处理系统对Java来说非常合适。

一个更具表现力的版本会更好

myError.isErrorOrAbove(otherError)

通过这种方式,您可以在枚举内定义顺序,并且如果愿意,可以在内部更改实现。现在,枚举的客户端可以比较值,而不需要知道任何有关它的详细信息

一个可能的实现是

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;
    }
}

我也不建议使用ordinal()方法进行比较,因为当有人更改枚举值的定义顺序时,可能会出现意外行为。

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

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();
    }
  };        
}
import java.util.Comparator;
公众普查日{
星期一(1,3),
星期二(2、6),
星期三(3、5),
星期四(4,4),
星期五(5月2日),
星期六(6月1日),
星期日(0,0);
私人最终职位;
私有最终int工作层;
日(整数位置,整数级别){
日历位置=位置;
工作级别=级别;
}
int getCalendarPosition(){return calendarPosition;}
int getWorkLevel(){return workLevel;}
公共静态比较器calendarPositionComparator=新比较器(){
公共整数比较(d1天,d2天){
返回d1.getCalendarPosition()-d2.getCalendarPosition();
}
};
公共静态比较器workLevelComparator=新比较器(){
公共整数比较(d1天,d2天){
//降序,先硬一点
返回d2.getWorkLevel()-d1.getWorkLevel();
}
};        
}
驾驶员应检查所有设备是否正常工作:

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());
    }
  }
}
导入java.util.array;
导入java.util.Collections;
导入java.util.List;
公共类枚举测试
{
公共静态void main(字符串[]args){
List allDays=Arrays.asList(Day.values());
System.out.println(“==\n按日历位置的顺序列出天数:”;
Collections.sort(allDays、Day.calendarPositionComparator);
展示项目(全天);
System.out.println(“==\n按工作级别的顺序列出的天数:”;
Collections.sort(allDays、Day.workLevelComparator);
展示项目(全天);
}
公共静态无效显示项(列表天数){
用于(天:天){
System.out.println(day.name());
}
}
}

它显然不是一个真正的枚举。但是它有一个方法'IsGreaterEqual()'@ripper234:你的问题是“enum”,从中得到的信息是:“这个方法实现的自然顺序是常量声明的顺序”。因此enum{TRACE,DEBUG,INFO,WARN}意思是:TRACEimport 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()); } } }