Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы Enum в Java
Enum в Java — это специальный тип данных для создания набора постоянных значений. Хотя код выглядит просто, у Enum есть множество встроенных методов, наследуемых из класса java.lang.Enum:
1. name() — получить имя константы
Возвращает строковое имя перечисления:
public enum Status {
PENDING,
ACTIVE,
COMPLETED
}
public class Example {
public static void main(String[] args) {
Status status = Status.PENDING;
System.out.println(status.name()); // Вывод: PENDING
}
}
2. ordinal() — получить позицию
Возвращает порядковый номер константы (начиная с 0):
Status.PENDING.ordinal(); // 0
Status.ACTIVE.ordinal(); // 1
Status.COMPLETED.ordinal(); // 2
Полезно для сравнения приоритетов:
public enum Priority {
LOW(0),
MEDIUM(1),
HIGH(2);
private final int value;
Priority(int value) {
this.value = value;
}
public boolean isHigherThan(Priority other) {
return this.ordinal() > other.ordinal();
}
}
3. values() — получить все константы
Статический метод, возвращает массив всех значений:
public enum Color {
RED,
GREEN,
BLUE
}
public class Main {
public static void main(String[] args) {
Color[] colors = Color.values();
for (Color color : colors) {
System.out.println(color.name());
}
// Вывод:
// RED
// GREEN
// BLUE
}
}
Отлично для итерации и валидации:
public class EnumValidator {
public static boolean isValidStatus(String statusName) {
for (Status status : Status.values()) {
if (status.name().equals(statusName)) {
return true;
}
}
return false;
}
}
4. valueOf(String) — получить по имени
Статический метод, возвращает Enum константу по строке:
Status status = Status.valueOf("ACTIVE");
System.out.println(status); // ACTIVE
// Если строка не существует → IllegalArgumentException
try {
Status invalid = Status.valueOf("INVALID");
} catch (IllegalArgumentException e) {
System.out.println("Invalid status");
}
Основное использование — парсинг строк:
public class StatusParser {
public static Status parseStatus(String input) {
try {
return Status.valueOf(input.toUpperCase());
} catch (IllegalArgumentException e) {
return Status.PENDING; // дефолт
}
}
}
5. toString() — строковое представление
По умолчанию возвращает то же самое, что name(), но можно переопределить:
public enum HttpStatus {
OK(200, "OK"),
NOT_FOUND(404, "Not Found"),
INTERNAL_ERROR(500, "Internal Server Error");
private final int code;
private final String message;
HttpStatus(int code, String message) {
this.code = code;
this.message = message;
}
@Override
public String toString() {
return code + " " + message;
}
}
// Использование:
System.out.println(HttpStatus.OK); // 200 OK
6. equals() и == — сравнение
Это одна и та же операция для Enum, поскольку Enum константы — это синглтоны:
Status s1 = Status.ACTIVE;
Status s2 = Status.ACTIVE;
System.out.println(s1 == s2); // true
System.out.println(s1.equals(s2)); // true
Всегда используй ==, не equals() для Enum:
public class RequestHandler {
public void handleStatus(Status status) {
// ✅ Правильно
if (status == Status.ACTIVE) {
processActive();
}
// ❌ Неправильно (but still works)
// if (status.equals(Status.ACTIVE)) { ... }
}
}
7. compareTo() — сравнение по ordinal()
Сравнивает Enum константы по их порядку определения:
Status.ACTIVE.compareTo(Status.PENDING); // 1 (ACTIVE > PENDING)
Status.PENDING.compareTo(Status.ACTIVE); // -1
Status.PENDING.compareTo(Status.PENDING); // 0
Полезно для сортировки:
public class Task {
private Priority priority;
public static void sortByPriority(List<Task> tasks) {
tasks.sort((t1, t2) -> t1.priority.compareTo(t2.priority));
}
}
8. getDeclaringClass() — получить класс Enum
Возвращает Class объект самого Enum:
Status status = Status.ACTIVE;
Class<?> enumClass = status.getDeclaringClass();
System.out.println(enumClass.getName()); // Status
Полезно для рефлексии:
public class EnumIntrospection {
public static void printEnumInfo(Enum<?> value) {
Class<?> enumClass = value.getDeclaringClass();
System.out.println("Enum: " + enumClass.getSimpleName());
System.out.println("Value: " + value.name());
System.out.println("Ordinal: " + value.ordinal());
}
}
9. clone() — защита от клонирования
Enums НЕ МОГУТ быть клонированы. Попытка вызова clone() выбросит исключение:
// ❌ Это не сработает
Status original = Status.ACTIVE;
try {
Status cloned = (Status) original.clone();
} catch (CloneNotSupportedException e) {
System.out.println("Cannot clone enum");
}
Это желательное свойство — гарантирует, что константы остаются синглтонами.
10. Пример с методами экземпляра
public enum DayOfWeek {
MONDAY("Понедельник", true),
TUESDAY("Вторник", true),
WEDNESDAY("Среда", true),
THURSDAY("Четверг", true),
FRIDAY("Пятница", true),
SATURDAY("Суббота", false),
SUNDAY("Воскресенье", false);
private final String russianName;
private final boolean isWorkday;
DayOfWeek(String russianName, boolean isWorkday) {
this.russianName = russianName;
this.isWorkday = isWorkday;
}
public String getRussianName() {
return russianName;
}
public boolean isWorkday() {
return isWorkday;
}
public int getOrdinalFromMonday() {
return ordinal(); // 0 для Monday, 6 для Sunday
}
}
public class DaySchedule {
public static void main(String[] args) {
DayOfWeek day = DayOfWeek.FRIDAY;
System.out.println(day.name()); // FRIDAY
System.out.println(day.getRussianName()); // Пятница
System.out.println(day.isWorkday()); // true
System.out.println(day.ordinal()); // 4
System.out.println(day.compareTo(DayOfWeek.MONDAY)); // 4
for (DayOfWeek d : DayOfWeek.values()) {
System.out.println(d + ": " + d.getRussianName());
}
}
}
11. Enum с интерфейсами
Enum может реализовывать интерфейсы и переопределять методы:
public enum Operation {
ADD("Addition") {
@Override
public int apply(int a, int b) {
return a + b;
}
},
SUBTRACT("Subtraction") {
@Override
public int apply(int a, int b) {
return a - b;
}
};
private final String description;
Operation(String description) {
this.description = description;
}
public abstract int apply(int a, int b);
public String getDescription() {
return description;
}
}
public class Calculator {
public static void main(String[] args) {
int result = Operation.ADD.apply(5, 3);
System.out.println(result); // 8
}
}
Сводка основных методов
| Метод | Возвращает | Пример |
|---|---|---|
| name() | String | "ACTIVE" |
| ordinal() | int | 1 |
| values() | T[] | [PENDING, ACTIVE, ...] |
| valueOf(String) | T | Status.valueOf("ACTIVE") |
| toString() | String | "ACTIVE" (или переопределено) |
| equals() | boolean | status.equals(Status.ACTIVE) |
| compareTo() | int | status.compareTo(other) |
| getDeclaringClass() | Class<?> | Status.class |
Эти методы позволяют работать с Enum гибко и безопасно, используя их как type-safe альтернативу строкам и числам.