比较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());
}
}
}