Преобразование значений enum в int в Java: метод getTaxValue()

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для преобразования элемента перечисления enum в целое число в Java используйте метод ordinal(), который возвращает позицию элемента в перечислении, начиная с нуля.

Пример с кодом:

Java
Скопировать код
enum Day {
    MONDAY, TUESDAY, WEDNESDAY;
}

int dayIndex = Day.MONDAY.ordinal(); // Возвращает "0"

Учтите: метод ordinal() возвращает позицию элемента в перечислении. Поменяв порядок элементов, вы измените возвращаемые значения, что может привести к ошибкам в логике программы.

Кинга Идем в IT: пошаговый план для смены профессии

Вариации дальше ordinal(): индивидуальные целочисленные значения для элементов перечисления

В некоторых ситуациях использование порядковых чисел неприемлемо, и требуются точные целочисленные значения для элементов перечисления. Вы можете сделать это следующим образом:

Java
Скопировать код
public enum TaxCode {
    EXEMPT(0),
    STANDARD(10),
    REDUCED(5);

    private final int taxValue;

    TaxCode(int taxValue) {
        this.taxValue = taxValue;
    }

    public int getTaxValue() {
        return taxValue;
    }
}

int tax = TaxCode.EXEMPT.getTaxValue(); // Возвращает '0'

В данном случае применение метода .ordinal() привело бы к неверному соответствию, поэтому мы определили метод getTaxValue(), который обеспечивает правильное целочисленное значение.

Альтернативные методы преобразования перечисления в целое число

Сценарий: необходимость вычислений

Если выраничивание логических операций или вычислений встраивается в ваш алгоритм, используйте выражения switch-case.

Java
Скопировать код
public int getTaxValue(TaxCode taxCode) {
    switch (taxCode) {
        case EXEMPT: return 0;
        case STANDARD: return 10;
        case REDUCED: return 5;
        default: throw new IllegalArgumentException("Неизвестный код налога");
    }
}

Сценарий: неприменимость перечислений

Если enum не подходит как инструмент, можно прибегнуть к статическим классам с публичными константами, вроде перечислений в C#.

Java
Скопировать код
public class TaxCode {
    public static final int EXEMPT = 0;
    public static final int STANDARD = 10;
    public static final int REDUCED = 5;

    // Пример использования
    int taxValue = TaxCode.EXEMPT;
}

Визуализация

Перечисление уровней доступа можно представить как список паролей для входа в систему:

Markdown
Скопировать код
Уровни перечислений:    [GOLD, SILVER, BRONZE]

И каждый уровень имеет уникальный пароль:

Markdown
Скопировать код
| Уровень перечисления | Пароль (int) |
| -------------------- | ------------- |
| GOLD                 | 1             |
| SILVER               | 2             |
| BRONZE               | 3             |

Можем установить, что GOLD соответствует паролю 1:

Java
Скопировать код
int passcode = Level.GOLD.ordinal(); // возвращает '0', а не '1'

На практике нам надо метод, например getAccessLevel, который вернёт истинный пароль (целое число), а не позицию элемента перечисления.

Заключение

Важность последовательности

Если ваш код активно ориентируется на ordinal(), помните, что порядок элементов перечисления должен быть постоянным. Изменяя этот порядок, будьте готовы к последствиям.

Расширение перечислений

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

Сравнение Enum и int

Хотя перечисления в Java вызывают дополнительные накладные расходы по сравнению с простыми типами, такими как int, они предоставляют типовую надёжность, определённый контекст и улучшают читаемость кода.

Полезные материалы

  1. Типы перечислений (Учебники Java™) — полное руководство по использованию перечислений в Java.
  2. java – Получение перечисления, связанного с целочисленным значением – Stack Overflow — качественные решения для связывания целочисленных значений с элементами перечисления.
  3. Enum (Java Platform SE 7) — официальная документация для метода ordinal().
  4. Java Practices->Type Safe Enumerations — дискуссия о типовой надёжности перечислений.
  5. enum в Java – GeeksforGeeks — подробное изучение перечислений с примерами.
  6. Типы перечислений (Учебники Java™ > Операторы переключения) — применение перечислений в операторах switch.