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)
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值被定义,您可能会遇到意外行为.
我想检查错误级别是"错误还是以上".
这样的枚举应该具有与之相关的级别.因此,要找到等于或大于等于你应该比较的水平.
使用序数依赖于枚举值出现的顺序.如果你依赖于此,你应该记录它,否则这样的依赖会导致代码脆弱.
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)
| 归档时间: |
|
| 查看次数: |
68866 次 |
| 最近记录: |