Java for Beginner
678 subscribers
562 photos
156 videos
12 files
862 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Enum в Java

В Java класс Enum представляет собой специальный тип данных, который используется для определения набора констант. В большинстве языков программирования, включая Java, enum помогает группировать связанные значения, делая код более читаемым, управляемым и защищенным от ошибок.

Enum — это сокращение от "enumeration" (перечисление), которое позволяет создать ограниченный набор именованных значений, определенных пользователем. Например, enum Day может содержать такие значения, как MONDAY, TUESDAY, WEDNESDAY и т. д. Enum в Java — это не просто набор констант, а полноценный класс, что дает ему дополнительные возможности.

Основные характеристики Enum в Java:
Каждый элемент перечисления является экземпляром самого перечисления.
Enum автоматически предоставляет методы для перечисления всех значений (values()) и поиска элементов по имени (valueOf(String name)).
Перечисления можно использовать в операторах switch, что упрощает логическую обработку.
Enum можно расширять полями, методами и конструкторами, как и обычные классы.
Все перечисления неявно наследуют класс java.lang.
Enum, что делает их типобезопасными и защищенными от непредусмотренного изменения.

Пример простого Enum:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
В этом примере Day — это перечисление, которое содержит дни недели как свои элементы.


Внутреннее устройство Enum в Java

Под капотом каждое перечисление в Java представляет собой класс, расширяющий абстрактный базовый класс java.lang.Enum. Когда вы определяете перечисление, компилятор автоматически генерирует соответствующий класс, который наследуется от Enum и содержит все элементы в виде его экземпляров.

Например, перечисление:
enum Color {
RED, GREEN, BLUE
}


Компилируется в такой класс:
final class Color extends Enum<Color> {
public static final Color RED = new Color("RED", 0);
public static final Color GREEN = new Color("GREEN", 1);
public static final Color BLUE = new Color("BLUE", 2);

private Color(String name, int ordinal) {
super(name, ordinal);
}

public static Color[] values() {
return new Color[]{RED, GREEN, BLUE};
}

public static Color valueOf(String name) {
return Enum.valueOf(Color.class, name);
}
}


Каждый элемент перечисления — это статическая константа, представляющая собой экземпляр Enum. Класс Enum автоматически реализует методы toString(), compareTo(), ordinal(), name(), что упрощает его использование и делает enum мощным инструментом.

Основные внутренние компоненты Enum:

Имя (name): Каждое перечисление имеет уникальное имя, которое можно получить с помощью метода name().
Порядковый номер (ordinal): Метод ordinal() возвращает позицию элемента в перечислении, начиная с 0. Например, для
Color.RED значение будет 0, для Color.GREEN — 1.
Методы values() и valueOf(): Метод values() возвращает массив всех элементов перечисления, а valueOf() позволяет найти элемент по имени.


Расширение Enum дополнительными методами и конструкторами

Java позволяет расширять перечисления собственными полями, конструкторами и методами. Рассмотрим пример:

enum Fruit {
APPLE("Red"), BANANA("Yellow"), GRAPE("Purple");

private String color;

// Конструктор перечисления
Fruit(String color) {
this.color = color;
}

// Метод для получения цвета фрукта
public String getColor() {
return color;
}
}

public class EnumExample {
public static void main(String[] args) {
for (Fruit fruit : Fruit.values()) {
System.out.println(fruit + " is " + fruit.getColor());
}
}
}


Вывод:
APPLE is Red
BANANA is Yellow
GRAPE is Purple
В этом примере у каждого элемента перечисления есть дополнительное поле color и метод getColor(), который возвращает значение этого поля.


#Java #Training #Medium #Enum
Применение Enum в Java

Использование в switch-case

Перечисления поддерживаются конструкцией switch-case, что делает код более читабельным и легко расширяемым:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public class EnumSwitchExample {
public static void main(String[] args) {
Day day = Day.FRIDAY;

switch (day) {
case MONDAY:
System.out.println("Start of the work week!");
break;
case FRIDAY:
System.out.println("Almost the weekend!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Weekend!");
break;
default:
System.out.println("Midweek day.");
break;
}
}
}


Использование в качестве флагов конфигурации

Перечисления можно использовать для настройки параметров конфигурации:
enum LogLevel {
DEBUG, INFO, WARNING, ERROR, CRITICAL
}

public class Logger {
private LogLevel logLevel;

public Logger(LogLevel logLevel) {
this.logLevel = logLevel;
}

public void log(String message) {
if (logLevel.ordinal() >= LogLevel.WARNING.ordinal()) {
System.out.println("LOG [" + logLevel + "]: " + message);
}
}

public static void main(String[] args) {
Logger logger = new Logger(LogLevel.WARNING);
logger.log("This is a debug message."); // Не будет напечатано
logger.log("This is a warning."); // Будет напечатано
}
}
В этом примере LogLevel используется для управления уровнем логирования.


Реализация шаблона Singleton

Перечисления в Java — это идеальный способ реализации шаблона Singleton:
enum Singleton {
INSTANCE;

public void showMessage() {
System.out.println("Singleton instance");
}

public static void main(String[] args) {
Singleton.INSTANCE.showMessage();
}
}
Этот пример показывает, как создать Singleton с помощью enum. В отличие от обычных классов, этот подход гарантирует, что будет создан только один экземпляр, даже в условиях многопоточности.


#Java #Training #Medium #Enum