Vergleichen Sie Java-Enum-Werte

Lesezeit: 4 Minuten

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 ints, 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

Benutzer-Avatar
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.

1055880cookie-checkVergleichen Sie Java-Enum-Werte

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy