2009-07-19 12 views

Odpowiedz

43

Wszystkie teksty stałe Java realizuje Porównywalne: http://java.sun.com/javase/6/docs/api/java/lang/Enum.html

Można również użyć metody ordinal aby przekształcić je w int s, a następnie porównanie jest trywialne.

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

To naprawdę nie jest najwyraźniej enum. Ale ma metodę "isGreaterOrEqual()" – ripper234

+4

@ ripper234: Twoje pytanie mówi "enum" –

+0

@Tim - cóż, zaakceptowałem. – ripper234

8

Zakładając, że zdefiniowałeś je według kolejności występowania, możesz porównać liczby porządkowe każdej wartości. Argument porządkowy jest jego pozycją w deklaracji enum, gdzie początkowa stała ma przypisaną liczbę porządkową równą zeru.

Otrzymujesz porządek porządkowy, wywołując metodę ordinal() wartości.

5

Chcę sprawdzić, czy poziom błędu to "błąd lub powyżej".

Takie wyliczenie powinno mieć poziom z nim związany. Aby znaleźć równe lub większe wartości, powinieneś porównać poziomy.

Posługiwanie się porządkiem polega na wyświetlaniu wartości wyliczenia. Jeśli polegasz na tym, powinieneś to udokumentować, inaczej taka zależność może prowadzić do kruchego kodu.

1

Innym rozwiązaniem byłoby

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

od Twoje pytanie, jestem przy założeniu, że używasz enum wyznaczyć jakąś wartość zwracana, z których niektóre są stany błędów. Ta implementacja ma tę zaletę, że nie trzeba dodawać nowych typów zwracanych w określonym miejscu (a następnie dostosowywać wartości testowej), ale ma tę wadę, że wymaga dodatkowej pracy przy inicjowaniu wyliczenia.

Kontynuując moje przypuszczenie nieco dalej, czy kody błędów są dla użytkownika? Narzędzie do debugowania? Jeśli jest to drugie, okazało się, że system obsługi wyjątków jest całkiem w porządku dla Javy.

17

wersja, która jest znacznie bardziej wyraziste będzie

myError.isErrorOrAbove(otherError) 

lub

myError.isWorseThan(otherError) 

W ten sposób można określić kolejność wewnątrz Enum i może zmienić implementację wewnętrznie, jeśli chcesz. Teraz klienci Enum mogą porównywać wartości bez znajomości szczegółów.

Ewentualna realizacja whould być

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

Ja również nie polecam przy użyciu metody porządkowej() dla porównania, bo gdy ktoś zmienia kolejność wartości są zdefiniowane Enum można uzyskać nieoczekiwane zachowanie.

+0

Uzgodnione. Poleganie na pozycjach porządkowych jest ogromnym błędem i potencjalnie może prowadzić do bardzo trudnych do wykrycia błędów. – Michael

3

Java enum zbudował już w metodzie compareTo(..), która używa pozycji wyliczeniowej (zwykłej) do porównywania jednego obiektu z innym.Pozycja jest określana na podstawie kolejności, w której wartości stałe są deklarowane , gdzie pierwszej stałej przypisuje się liczbę porządkową równą zeru.
Jeśli układ jest nieodpowiedni, może trzeba zdefiniować jesteś właścicielem porównawczy dodając pole wewnętrzne (y), jak pokazano poniżej:

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

kierowcy, by sprawdzić, czy wszystko działa:

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()); 
    } 
    } 
} 
Powiązane problemy