Преобразование значений enum в int в Java: метод getTaxValue()
Быстрый ответ
Для преобразования элемента перечисления enum
в целое число в Java используйте метод ordinal()
, который возвращает позицию элемента в перечислении, начиная с нуля.
Пример с кодом:
enum Day {
MONDAY, TUESDAY, WEDNESDAY;
}
int dayIndex = Day.MONDAY.ordinal(); // Возвращает "0"
Учтите: метод ordinal()
возвращает позицию элемента в перечислении. Поменяв порядок элементов, вы измените возвращаемые значения, что может привести к ошибкам в логике программы.
Вариации дальше ordinal(): индивидуальные целочисленные значения для элементов перечисления
В некоторых ситуациях использование порядковых чисел неприемлемо, и требуются точные целочисленные значения для элементов перечисления. Вы можете сделать это следующим образом:
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
.
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#.
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;
}
Визуализация
Перечисление уровней доступа можно представить как список паролей для входа в систему:
Уровни перечислений: [GOLD, SILVER, BRONZE]
И каждый уровень имеет уникальный пароль:
| Уровень перечисления | Пароль (int) |
| -------------------- | ------------- |
| GOLD | 1 |
| SILVER | 2 |
| BRONZE | 3 |
Можем установить, что GOLD соответствует паролю 1:
int passcode = Level.GOLD.ordinal(); // возвращает '0', а не '1'
На практике нам надо метод, например getAccessLevel
, который вернёт истинный пароль (целое число), а не позицию элемента перечисления.
Заключение
Важность последовательности
Если ваш код активно ориентируется на ordinal()
, помните, что порядок элементов перечисления должен быть постоянным. Изменяя этот порядок, будьте готовы к последствиям.
Расширение перечислений
Для перечислений, склонных к изменению и расширению, лучше использовать не порядковые номера, а конкретные значения или методы для их получения, связанные с элементами. Это поможет избежать ошибок и сделает ваш код более прозрачным.
Сравнение Enum и int
Хотя перечисления в Java вызывают дополнительные накладные расходы по сравнению с простыми типами, такими как int, они предоставляют типовую надёжность, определённый контекст и улучшают читаемость кода.
Полезные материалы
- Типы перечислений (Учебники Java™) — полное руководство по использованию перечислений в Java.
- java – Получение перечисления, связанного с целочисленным значением – Stack Overflow — качественные решения для связывания целочисленных значений с элементами перечисления.
- Enum (Java Platform SE 7) — официальная документация для метода
ordinal()
. - Java Practices->Type Safe Enumerations — дискуссия о типовой надёжности перечислений.
- enum в Java – GeeksforGeeks — подробное изучение перечислений с примерами.
- Типы перечислений (Учебники Java™ > Операторы переключения) — применение перечислений в операторах
switch
.