Java for Beginner
743 subscribers
708 photos
196 videos
12 files
1.14K 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
Основы ООП в Java

Глава 6. Ключевые модификаторы ООП


Перечисления (enum)

Перечисление (
enum) — это специальный класс, который представляет фиксированный набор констант (например, дни недели, цвета или статусы). Enum введен в Java 5 и является полноценным классом, наследующим от java.lang.Enum, но с особым синтаксисом.

Зачем нужен enum:
Типобезопасность: Вместо int или String для констант (где возможны ошибки, как 8 для дня недели), enum гарантирует только допустимые значения.
Читаемость: Код становится самодокументируемым (Day.MONDAY clearer, чем 1).
ООП-функции:
Enum может иметь поля, методы, конструкторы.
Переключатели: Идеально для switch, без ошибок.
Неизменяемость:
Enum константы immutable и final.

Enum — это абстракция для групп констант, делая код robust и maintainable.


Синтаксис и базовое использование enum

Enum объявляется как класс, но с enum вместо class. Константы перечисляются через запятую.

Синтаксис:
public enum EnumName {
CONSTANT1,
CONSTANT2,
// ...
}


Пример для дней недели:
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}


Использование:
public class Main {
public static void main(String[] args) {
Day today = Day.WEDNESDAY; // Константа
System.out.println(today); // WEDNESDAY

if (today == Day.WEDNESDAY) { // Сравнение через ==
System.out.println("Середина недели!");
}
}
}


Нюанс: Enum константы — это объекты, но сравниваются через == (не equals, так как уникальные).

Вывод:
System.out.println(today) вызывает toString(), который возвращает имя константы.



Enum с полями, конструкторами и методами

Enum — полноценный класс, так что может иметь private конструкторы, поля и методы. Константы вызывают конструктор.

Пример с полями:

public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6);

private final double mass; // Масса в кг
private final double radius; // Радиус в м

// Конструктор (private по умолчанию)
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}

// Метод
public double surfaceGravity() {
final double G = 6.67300E-11; // Константа гравитации
return G * mass / (radius * radius);
}
}


Использование:
Planet earth = Planet.EARTH;
System.out.println("Гравитация на Земле: " + earth.surfaceGravity()); // ~9.8


Нюанс: Конструктор private (нельзя new Planet()). Константы — единственные экземпляры.
Методы: Могут быть абстрактными (каждая константа реализует) или обычными.



#Java #для_новичков #beginner #OOP #Enum
👍3
Методы Enum-класса и полезные функции

Enum наследует от Enum<E>, предоставляя методы:
name(): Возвращает имя константы как String.
ordinal(): Порядковый номер (начиная с 0).
valueOf(String name): Возвращает
enum по имени.
values(): Массив всех констант.


Пример:
Day[] days = Day.values();
for (Day d : days) {
System.out.println(d + " ordinal: " + d.ordinal());
}

Вывод: MONDAY ordinal: 0, etc.


Нюанс: ordinal() не рекомендуется для логики — лучше поля, так как порядок может измениться.


Switch с enum

Enum идеален для switch — безопасно и читаемо.
public void printDayType(Day day) {
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
System.out.println("Рабочий день");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Выходной");
break;
}
}


Нюанс: Нет default, если все случаи покрыты — компилятор не требует.


Все нюансы enum

Наследование и реализация:
Enum не может extends класс (уже extends Enum), но может implements интерфейсы.
Нюанс: public
enum MyEnum implements Interface { ... }


Конструкторы и поля:
Конструкторы private.
Константы должны быть первыми в
enum, за ними — поля/методы.
Нюанс: Константы с параметрами: CONSTANT(params),


Иммутабельность: Enum константы final и immutable — идеально для singleton.
Сериализация: Enum сериализуется по имени, безопасно.

Ошибки:

Enum с public конструктором — ошибка.
valueOf("INVALID") — IllegalArgumentException.
Enum не может быть abstract, но может иметь abstract методы (константы реализуют).


Дизайн:
Используйте для фиксированных наборов (статусы, типы).
Добавляйте методы для логики.
Нюанс: Nested
enum — static по умолчанию.


Как создать это в IntelliJ IDEA

Enum: New → Enum → Planet.
Константы: Напишите MERCURY(3.303e+23, 2.4397e6), — IDE подскажет конструктор.
Методы: Добавьте surfaceGravity() — IDE поможет с override для abstract.
Switch: Напишите switch (day) — IDE сгенерирует cases.



Полезные советы для новичков

Замените int/String константы: Enum safer.
Добавляйте toString(): Переопределите для custom вывода.
Используйте в коллекциях: Set для уникальных.
ordinal() осторожно: Лучше поля для значений.
Ресурсы: Oracle Tutorials on
Enum Types.


#Java #для_новичков #beginner #OOP #Enum
👍3