Подтвердить что ты не робот

Сравнение значений пересылки Java

Есть ли способ проверить, является ли значение перечисления "больше/равно" другому значению?

Я хочу проверить, является ли уровень ошибки "ошибкой или выше".

4b9b3361

Ответ 1

Все Java перечисления реализуют Comparable: http://java.sun.com/javase/6/docs/api/java/lang/Enum.html

Вы также можете использовать метод ordinal, чтобы превратить их в int s, тогда сравнение тривиально.

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

Ответ 2

Более выразительная версия будет

myError.isErrorOrAbove(otherError)

или

myError.isWorseThan(otherError)

Таким образом вы можете определить порядок внутри 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;
    }
}

Я также не рекомендую использовать метод ordinal() для сравнения, потому что когда кто-то изменяет порядок значений Enum, вы можете получить неожиданное поведение.

Ответ 3

Предполагая, что вы определили их в порядке серьезности, вы можете сравнить ординалы каждого значения. Ординал - это его позиция в объявлении перечисления, где исходной константе присваивается порядковый номер нуля.

Вы получаете порядковый номер, вызывая метод ordinal() значения.

Ответ 4

Я хочу проверить, является ли уровень ошибки "ошибкой или выше".

Такое перечисление должно иметь уровень, связанный с ним. Поэтому, чтобы найти равных или больше, вы должны сравнить уровни.

Использование ординала зависит от порядка появления значений перечисления. Если вы полагаетесь на это, вы должны документировать его, иначе такая зависимость может привести к хрупкому коду.

Ответ 5

Java enum уже встроен в метод compareTo (..), в котором используется позиция перечисления (aka ordinal), чтобы сравнить один объект с другим. Позиция определяется на основе порядка, в котором объявлены константы enum , где первой константе присваивается порядковый номер нуля.
Если эта компоновка непригодна, вам может потребоваться определить собственный компаратор, добавив внутренние поля, как показано ниже:

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

Ответ 6

Другой вариант:

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

Из вашего вопроса, я предполагаю, что вы используете enum для обозначения некоторого возвращаемого значения, некоторые из которых являются состояниями ошибок. Эта реализация имеет то преимущество, что вам не нужно добавлять новые типы возвращаемых данных в определенном месте (а затем настраивать тестовое значение), но имеет недостаток в необходимости дополнительной работы по инициализации перечисления.

Выполняя мое предположение немного дальше, являются ли коды ошибок чем-то для пользователя? Инструмент отладки? Если это последнее, я обнаружил, что система обработки исключений для Java довольно хороша.