Gibt es eine Möglichkeit zu überprüfen, ob ein Aufzählungswert größer/gleich einem anderen Wert ist?
Ich möchte überprüfen, ob eine Fehlerstufe „Fehler oder höher“ ist.
Gibt es eine Möglichkeit zu überprüfen, ob ein Aufzählungswert größer/gleich einem anderen Wert ist?
Ich möchte überprüfen, ob eine Fehlerstufe „Fehler oder höher“ ist.
Alle Java-Enums implementiert Vergleichbar: http://java.sun.com/javase/6/docs/api/java/lang/Enum.html
Sie können auch die verwenden ordinal
Methode, sie zu verwandeln int
s, dann ist der Vergleich trivial.
if (ErrorLevel.ERROR.compareTo(someOtherLevel) <= 0) {
...
}
Es ist anscheinend nicht wirklich eine Aufzählung. Aber es hat eine Methode ‘isGreaterOrEqual()’
– Reißer234
19. Juli 2009 um 11:33 Uhr
@ripper234: Ihre Frage sagt “enum”
– Tim Büthe
27. Mai 2011 um 13:48 Uhr
Die Take-Home-Message von docs.oracle.com/javase/7/docs/api/java/lang/… ist: “Die von dieser Methode implementierte natürliche Reihenfolge ist die Reihenfolge, in der die Konstanten deklariert werden.”. Daher enum { TRACE, DEBUG, INFO, WARN } bedeutet: TRACE < DEBUG < INFO < WARN.
– David Tonhofer
30. Januar 2013 um 17:05 Uhr
Eine Version, die viel ausdrucksstärker ist, wäre
myError.isErrorOrAbove(otherError)
oder
myError.isWorseThan(otherError)
Auf diese Weise können Sie die Reihenfolge innerhalb des Enums definieren und die Implementierung intern ändern, wenn Sie möchten. Jetzt können die Clients der Enum Werte vergleichen, ohne Details darüber zu wissen.
Eine mögliche Implementierung wäre
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;
}
}
Ich würde auch nicht empfehlen, die Methode ordinal() zum Vergleich zu verwenden, da es zu unerwartetem Verhalten kommen könnte, wenn jemand die Reihenfolge ändert, in der die Enum-Werte definiert sind.
Einverstanden. Sich auf Ordinalpositionen zu verlassen, ist ein großer Fehler und könnte möglicherweise zu einigen sehr schwer nachzuvollziehenden Fehlern führen.
– Michael
18. Dezember 2017 um 9:12 Uhr
MaxZoom
Java Aufzählung ist schon eingebaut vergleichen mit(..) -Methode, die die Aufzählungsposition (auch Ordinalzahl genannt) verwendet, um ein Objekt mit einem anderen zu vergleichen. Die Position wird basierend auf der Reihenfolge bestimmt, in der die Aufzählung Konstanten werden deklariert, wobei der ersten Konstante eine Ordnungszahl von Null zugewiesen wird.
Wenn diese Anordnung ungeeignet ist, müssen Sie möglicherweise Ihren eigenen Komparator definieren, indem Sie interne Felder wie unten gezeigt hinzufügen:
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();
}
};
}
Treiber, um zu überprüfen, ob alles funktioniert:
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());
}
}
}
Das ist schrecklich von der Standardimplementierung, um es als endgültig zu markieren. Ich meine, wenn jemand die Enum-Reihenfolge neu anordnet, weil es schöner aussieht, dann könnte sich Ihr gesamtes Verhalten ändern.
– mjs
24. November 2021 um 20:00 Uhr
@mjs Deshalb empfehle ich, keine Enum-Ordnungszahl zu verwenden, sondern einen Wert als Konstruktorargument.
– MaxZoom
1. Februar um 19:23 Uhr
ja ich entscheide mich auch dafür.
– mjs
1. Februar um 19:35 Uhr
Angenommen, Sie haben sie nach Schweregrad geordnet, können Sie die Ordnungszahlen der einzelnen Werte vergleichen. Die Ordinalzahl ist ihre Position in ihrer Enum-Deklaration, wobei der anfänglichen Konstante eine Ordinalzahl von Null zugewiesen wird.
Sie erhalten die Ordnungszahl, indem Sie die Methode ordinal() des Werts aufrufen.
Ich möchte überprüfen, ob eine Fehlerstufe „Fehler oder höher“ ist.
Einem solchen Enum sollte eine Ebene zugeordnet sein. Um also gleich oder größer zu finden, sollten Sie die Ebenen vergleichen.
Die Verwendung von ordinal hängt von der Reihenfolge ab, in der die Aufzählungswerte angezeigt werden. Wenn Sie sich darauf verlassen, sollten Sie dies dokumentieren, da eine solche Abhängigkeit sonst zu sprödem Code führen kann.
Eine andere Möglichkeit wäre
enum Blah {
A(false), B(false), C(true);
private final boolean isError;
Blah(boolean isErr) {isError = isErr;}
public boolean isError() { return isError; }
}
Aus Ihrer Frage gehe ich davon aus, dass Sie enum verwenden, um eine Art Rückgabewert zu bezeichnen, von denen einige Fehlerzustände sind. Diese Implementierung hat den Vorteil, dass Sie die neuen Rückgabetypen nicht an einer bestimmten Stelle hinzufügen müssen (und dann Ihren Testwert anpassen), hat aber den Nachteil, dass etwas zusätzliche Arbeit beim Initialisieren der Aufzählung erforderlich ist.
Meine Vermutung etwas weiter verfolgend, sind Fehlercodes etwas für den Benutzer? Ein Debugging-Tool? Wenn es letzteres ist, fand ich das Ausnahmebehandlungssystem für Java ziemlich in Ordnung.