2009-07-19 133 views
34

有沒有辦法檢查一個枚舉值是否'更大/相等'到另一個值?比較Java枚舉值

我想檢查錯誤級別是'錯誤還是以上'。

回答

43

所有的Java枚舉實現可比:http://java.sun.com/javase/6/docs/api/java/lang/Enum.html

您還可以使用ordinal方法把它們變成int s,則比較是微不足道的。

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

這不是真的一個枚舉,顯然。但它有一個方法'isGreaterOrEqual()' – ripper234 2009-07-19 11:33:43

+4

@ ripper234:你的問題說「枚舉」 – 2011-05-27 13:48:48

8

假設您已經按嚴重性的順序定義了它們,您可以比較每個值的序號。序數是它在枚舉聲明中的位置,初始常量的賦值是0的序數。

通過調用值的ordinal方法獲得序號。

5

我想檢查錯誤級別是'錯誤還是以上'。

這樣的枚舉應該有一個關聯的級別。所以要找到等於或大於你應該比較的水平。

使用序號依賴枚舉值的顯示順序。如果你依賴這個,你應該記錄它,否則這種依賴會導致代碼變得脆弱。

1

另一種選擇是

enum Blah { 
A(false), B(false), C(true); 
private final boolean isError; 
Blah(boolean isErr) {isError = isErr;} 
public boolean isError() { return isError; } 
} 

從你的問題,我假設你正在使用枚舉指定某種返回值的,其中有一些是錯誤狀態。這種實現的優點是不必在特定的地方添加新的返回類型(然後調整測試值),但缺點是需要一些額外的工作來初始化枚舉。

追求我的假設更進一步,是用戶的錯誤代碼的東西?一個調試工具?如果是後者,我發現異常處理系統對於Java來說非常合適。

17

這是更爲傳神一個版本將是

myError.isErrorOrAbove(otherError) 

myError.isWorseThan(otherError) 

這樣你可以定義枚舉內的順序,如果你喜歡可以在內部改變實現。現在,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; 
    } 
} 

我也不會建議使用有序()方法進行比較,因爲當有人改變了枚舉值的定義,你可以得到意外的行爲順序。

3

爪哇枚舉已經建立在compareTo(..)方法,它使用枚舉位置(又名有序)到一個對象比其他。該位置基於枚舉常量被聲明爲 的順序確定,其中第一個常量被指定爲0的序數。
如果這種安排是不合適的,則可能需要通過增加內部磁場(S)來定義你自己的比較如下圖所示:

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