← Назад к вопросам

Какие методы у Enum можно вызвать?

1.8 Middle🔥 161 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы 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()int1
values()T[][PENDING, ACTIVE, ...]
valueOf(String)TStatus.valueOf("ACTIVE")
toString()String"ACTIVE" (или переопределено)
equals()booleanstatus.equals(Status.ACTIVE)
compareTo()intstatus.compareTo(other)
getDeclaringClass()Class<?>Status.class

Эти методы позволяют работать с Enum гибко и безопасно, используя их как type-safe альтернативу строкам и числам.

Какие методы у Enum можно вызвать? | PrepBro