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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Применение StringTokenizer в реальных проектах

Парсинг конфигурационных файлов: В старых системах и приложениях StringTokenizer часто использовался для разбора простых конфигурационных файлов, где строки представляли собой пары ключ-значение, разделенные символами, такими как =, : или ;.
Анализ протоколов и логов: В текстовых логах, где строки разделены предсказуемыми символами (например, запятыми или табуляцией), StringTokenizer может быть полезен для быстрого выделения отдельных элементов.
Парсинг простых CSV-файлов: Хотя современные библиотеки для работы с CSV более предпочтительны, StringTokenizer можно использовать для чтения простых CSV-файлов, где разделителем является запятая.


Недостатки StringTokenizer

Несмотря на свои преимущества, StringTokenizer имеет ряд недостатков:
Отсутствие гибкости: Класс не поддерживает регулярные выражения, поэтому его возможности ограничены только простыми символами-разделителями.
Устаревший подход: В новых версиях Java его функциональность заменяется методами split() и классами из пакета java.util.regex.
Потоконебезопасность: StringTokenizer не синхронизирован и не подходит для использования в многопоточных средах без дополнительной синхронизации.


Альтернатива StringTokenizer

В большинстве современных приложений использование StringTokenizer заменяется более гибкими инструментами:

Метод String.split(): Позволяет разбирать строки с помощью регулярных выражений.
public class SplitExample {
public static void main(String[] args) {
String text = "Java,Python,C++,JavaScript";
String[] languages = text.split(",");

for (String language : languages) {
System.out.println(language);
}
}
}


Классы Pattern и Matcher: Используются для более сложного анализа и разбора строк с помощью регулярных выражений.
import java.util.regex.*;

public class PatternMatcherExample {
public static void main(String[] args) {
String text = "Java is powerful! Java is versatile!";
Pattern pattern = Pattern.compile("Java");
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println("Found 'Java' at index: " + matcher.start());
}
}
}


#Java #Training #Medium #StringTokenizer
И все равно их никто не читает😂😂😂

https://t.me/Java_for_beginner_dev

#Mems
Substring()

Метод substring() — один из ключевых инструментов работы со строками в Java. Он используется для получения подстрок из существующей строки, что позволяет извлекать и обрабатывать части текста в зависимости от задач приложения. substring() — простой, но очень мощный метод, который часто используется в повседневной разработке.

Описание и особенности метода substring()

Метод substring() в Java позволяет создать новую строку на основе части исходной строки. Он имеет два варианта вызова:
substring(int beginIndex) — возвращает подстроку, начиная с символа по индексу beginIndex и до конца строки.
substring(int beginIndex, int endIndex) — возвращает подстроку от символа по индексу beginIndex до символа по индексу endIndex (не включая его).

String text = "Hello, World!";
String result1 = text.substring(7); // Вернет: "World!"
String result2 = text.substring(0, 5); // Вернет: "Hello"
В первом примере мы создаем подстроку, начиная с индекса 7, и получаем строку "World!". Во втором примере подстрока берется от символа 0 до символа 5 (не включая 5), что возвращает "Hello".


Внутреннее устройство метода substring()

Под капотом метод substring() в классах String и StringBuilder имеет разное внутреннее устройство, что важно учитывать при работе с большими строками.

Реализация в классе String:
До Java 7 метод substring() создавал представление исходной строки с использованием тех же данных в памяти. Это означало, что даже если вам нужна была небольшая часть строки, метод ссылался на весь исходный массив символов. В некоторых ситуациях это приводило к "утечке памяти". Например, если большая строка сохранялась только ради небольшой подстроки, вся память исходной строки оставалась заблокированной.

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

Реализация в классе StringBuilder:
Для StringBuilder метод substring() работает аналогично, но он не создает новых строк, а возвращает копию содержимого StringBuilder в указанном диапазоне. Это делает его более производительным при многократных операциях над строками.

public class SubstringMemoryExample {
public static void main(String[] args) {
String largeString = "This is a very large string used for testing purposes...";

// Извлекаем короткую подстроку
String shortSubstring = largeString.substring(10, 20);

// Убедимся, что новая строка действительно мала
System.out.println("Подстрока: " + shortSubstring);
}
}
Здесь, начиная с Java 7, shortSubstring не будет занимать памяти, равной largeString, поскольку для подстроки создается новая копия символов.


Основные применения метода substring()

Извлечение определенных частей строки: substring() используется для выделения частей строк, таких как имя файла, расширение, часть URL или параметры из строки.
Парсинг строк: В парсинге текстовых данных метод помогает выделить нужные фрагменты, например, обработать шаблоны или строки фиксированной длины.
Форматирование и редактирование текста: Часто применяется для удаления ненужных символов в начале и конце строки или выделения определенных частей.


#Java #Training #Medium #substring
Примеры использования substring()

Извлечение имени файла и расширения:
public class FilenameExample {
public static void main(String[] args) {
String filePath = "example/document.pdf";

// Извлекаем имя файла
int lastSlash = filePath.lastIndexOf('/');
String filename = filePath.substring(lastSlash + 1); // Результат: "document.pdf"

// Извлекаем расширение файла
int dotIndex = filename.lastIndexOf('.');
String extension = filename.substring(dotIndex + 1); // Результат: "pdf"

System.out.println("Имя файла: " + filename);
System.out.println("Расширение: " + extension);
}
}
В этом примере метод substring() помогает выделить имя файла и его расширение, что полезно при работе с файловыми путями.


Выделение параметров из URL:

public class UrlParser {
public static void main(String[] args) {
String url = "https://example.com/page?user=JohnDoe&password=1234";

// Ищем начало параметров
int paramsIndex = url.indexOf('?');
String params = url.substring(paramsIndex + 1); // Результат: "user=JohnDoe&password=1234"

System.out.println("Параметры: " + params);
}
}
Здесь substring() используется для извлечения части URL, содержащей параметры.


Удаление первых и последних символов:

public class TrimCharacters {
public static void main(String[] args) {
String original = "<Hello, World!>";

// Удаляем символы "<" и ">"
String trimmed = original.substring(1, original.length() - 1); // Результат: "Hello, World!"

System.out.println("Оригинал: " + original);
System.out.println("Изменено: " + trimmed);
}
}
Метод позволяет удалить определенные символы с начала и конца строки, например, угловые скобки.


Важные моменты при работе с substring()
Обработка исключений: Если переданные индексы выходят за пределы строки, метод вызывает исключение StringIndexOutOfBoundsException. Это часто бывает при неправильной работе с переменными индексов:
public class SubstringExceptionExample {
public static void main(String[] args) {
String text = "Java";

try {
// Некорректные индексы
String invalidSubstring = text.substring(5);
} catch (StringIndexOutOfBoundsException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
}
Индексный диапазон: В методе substring() индекс beginIndex включается в подстроку, а endIndex — нет. Это важно учитывать при указании границ выделяемого фрагмента.


#Java #Training #Medium #substring
Всем доброго субботнего утра!!!🔆

Поделитесь в комментариях как прошла Ваша рабочая неделя?

В свою очередь поделюсь планами на будущие темы постов - по java core их осталось еще на 7 дней. После этого мы переходим к изучению Spring и всех входящих в него фраймворков.
Поэтому скорее всего все наши воскресные проекты, начнут плавно обрастать зависимостями и станут довольно сложны для новичков.


Как вы считаете, стоит и продолжать подавать информацию при лайф-кодинге как и дальше, без фраймворков?🧐

А в остальном, желаю всем хороших выходных и до встречи завтра!🖐
This media is not supported in your browser
VIEW IN TELEGRAM
Так нас слышит бабушка у подъезда (если слышит) 🤪😂😂😂

https://t.me/Java_for_beginner_dev

#Mems
Всем привет!🖐

Жаль Вас разочаровывать, но к сожалению сегодня я не смогу ничего показать🤷‍♂️
До этого я планировал улучшить наш предыдущий код, добавить зум и возможность паузы в симуляцию солнечной системы, попутно улучшив работу, но в процессе стали очевидны крайне негативные части моего кода с которым я уже второй день бьюсь, пока без явного успеха. 😞
Так что сегодня, придется Вам пережить мое отсутствие😐


Если кто-то вызовется в качестве начинателя какого-то кода или решения задач, буду рад его инициативе🤝
Класс StringReader в Java

В Java работа с потоками данных, таких как чтение и запись символов, реализована с помощью специальных классов, входящих в библиотеку ввода-вывода (java.io). Для чтения строковых данных в виде потоков символов предназначен класс StringReader. Этот класс является частью стандартной библиотеки Java и обеспечивает удобный интерфейс для чтения строк как потока символов.

Основная концепция StringReader

Класс StringReader используется для чтения содержимого строк как символов из потока. Он предоставляет функциональность, аналогичную чтению данных из файла или сетевого соединения, но только для строковых данных, хранящихся в оперативной памяти. По сути, он "эмулирует" файл, представляя строку в виде последовательности символов, которые можно читать по одному или группами.

StringReader является подклассом абстрактного класса Reader и реализует его методы, такие как read(), skip(), ready(), а также обеспечивает поддержку методов закрытия потока close().

Внутреннее устройство класса StringReader

Под капотом StringReader использует массив символов (char[]), созданный из переданной строки, а также управляет положением текущего символа в этом массиве.

Инициализация: При создании объекта StringReader строка передается в конструктор и сохраняется в виде массива символов. Например:
StringReader reader = new StringReader("Hello, World!");


Позиционирование указателя: Класс управляет указателем на текущую позицию в массиве символов, который увеличивается после каждого прочитанного символа. Это похоже на то, как читаются символы из файла или другого потока данных.
Методы чтения и пропуска: Методы read(), read(char[], int, int) и skip() управляют чтением и перемещением указателя. Например, метод read() возвращает текущий символ и сдвигает указатель на следующий.
Контроль конца строки: Когда указатель достигает конца строки, методы возвращают -1, указывая, что данные закончились. Это поведение аналогично поведению других потоков, таких как FileReader или InputStreamReader.

Поля и переменные

Внутренние поля класса StringReader:
String str — исходная строка, переданная в конструктор.
int length — длина строки.
int next — текущая позиция в строке.
int mark — позиция для функции отметки (mark), используется для возврата к определенному месту в потоке.


Основные особенности класса StringReader

Легковесность и простота: StringReader предназначен только для чтения строк, что делает его простым в использовании и легко интегрируемым с другими потоками.
Поток символов: В отличие от байтовых потоков, StringReader работает с символами (char), что позволяет удобно обрабатывать текстовую информацию, не занимаясь преобразованием кодировок.
Поддержка методов чтения и буферизации: Класс поддерживает методы чтения, такие как read() (читает один символ) и read(char[], int, int) (читает блок символов в массив). Это упрощает работу с данными в строках.
Сброс и отметка (mark): Класс поддерживает метод mark(int readAheadLimit), который позволяет установить позицию "отметки" в строке, чтобы потом вернуться к ней с помощью метода reset(). Это удобно при парсинге сложных строк.


#Java #Training #Medium #StringReader
Примеры использования StringReader

Чтение строки посимвольно:
import java.io.StringReader;
import java.io.IOException;

public class StringReaderExample {
public static void main(String[] args) {
String text = "Hello, Java!";
StringReader reader = new StringReader(text);

try {
int character;
// Чтение символов один за другим
while ((character = reader.read()) != -1) {
System.out.print((char) character); // Печатает каждый символ строки
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Результат:
Hello, Java!
В этом примере мы используем StringReader для чтения строки посимвольно. Метод read() возвращает код символа, который мы приводим к char для отображения.


Чтение блока символов:

import java.io.StringReader;
import java.io.IOException;

public class StringReaderBufferExample {
public static void main(String[] args) {
String text = "This is an example of using StringReader.";
StringReader reader = new StringReader(text);
char[] buffer = new char[10]; // Создаем буфер для чтения 10 символов

try {
int charsRead;
while ((charsRead = reader.read(buffer, 0, buffer.length)) != -1) {
System.out.print(new String(buffer, 0, charsRead));
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


Результат:
This is an example of using StringReader.
Здесь мы используем буфер для чтения группы символов за один раз, что упрощает обработку больших строк.


Использование метода mark и reset:
import java.io.StringReader;
import java.io.IOException;

public class StringReaderMarkResetExample {
public static void main(String[] args) {
String text = "Mark and reset example";
StringReader reader = new StringReader(text);

try {
System.out.print((char) reader.read()); // Читаем первый символ 'M'
reader.mark(10); // Ставим метку после первого символа
System.out.print((char) reader.read()); // Читаем следующий символ 'a'
System.out.print((char) reader.read()); // Читаем символ 'r'
reader.reset(); // Возвращаемся к метке
System.out.print((char) reader.read()); // Читаем снова символ 'a'
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Результат:
Метод mark() позволяет установить точку возврата в потоке, а reset() перемещает указатель обратно к этой точке. В примере видно, что после вызова reset() символ 'a' читается повторно.


Применение StringReader в реальных проектах


Парсинг строковых данных: StringReader полезен при разборе и анализе строковых данных, особенно если данные поступают в виде строк.
Тестирование методов ввода-вывода: Класс часто используется в юнит-тестах для эмуляции файловых или сетевых потоков. Например, при тестировании методов, принимающих Reader как параметр, StringReader позволяет подставить строку и протестировать метод без создания файлов.
Обработка текстовых данных: Преобразование строковых данных, удаление символов или замена частей строк с использованием StringReader делают код более удобным и читаемым.


#Java #Training #Medium #StringReader
Что выведет код?

import java.io.*;

public class Main {
public static void Task071024_1(String[] args) throws IOException {
String input = "Java\nis\nawesome!";
StringReader reader = new StringReader(input);
int character;
int count = 0;

while ((character = reader.read()) != -1) {
if ((char) character == '\n') {
count++;
}
}

System.out.println(count);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
14%
0
14%
1
14%
2
18%
3
41%
12556554785
Тестировщики бл....😂🤪

https://t.me/Java_for_beginner_dev

#Mems
Что выведет код?

import java.util.regex.*;

public class Task071024_2 {
public static void main(String[] args) {
String input = "abc123xyz456def789";
String regex = "\\d{3}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

StringBuilder result = new StringBuilder();

while (matcher.find()) {
result.append(matcher.group()).append("-");
}

System.out.println(result.substring(0, result.length() - 1));
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
0%
123456789
55%
123-456-789
18%
abc-xyz-def
27%
123-xyz-456-789
Класс StringWriter в Java

В отличие от класса StringReader, который предназначен для чтения строк как потока символов, StringWriter используется для записи данных в строку, представляя их в виде потока символов. Этот класс является частью стандартной библиотеки Java и реализует интерфейс Writer, что делает его идеальным выбором для формирования строковых данных в процессе выполнения программы.

Основная концепция StringWriter

Класс StringWriter предназначен для записи символьных данных во внутренний буфер, который по сути является объектом типа StringBuffer или StringBuilder. Данные можно записывать посимвольно, массивами символов или целыми строками. Это позволяет удобно накапливать строки и манипулировать ими, что полезно при динамическом формировании текстов или при выводе данных в виде текста.

После завершения записи содержимое StringWriter можно получить как обычную строку, используя метод toString(). В отличие от других классов Writer, таких как FileWriter или PrintWriter, StringWriter не связан с файловой системой или внешними ресурсами, что делает его безопасным и удобным для работы с текстовыми данными в оперативной памяти.

Внутреннее устройство класса StringWriter

Под капотом StringWriter использует объект StringBuffer или StringBuilder в качестве внутреннего буфера для хранения записываемых данных.

Инициализация: Когда создается объект StringWriter, инициализируется внутренний буфер. По умолчанию используется StringBuffer с начальной емкостью 16 символов. Вы можете задать эту емкость явно через конструктор, если ожидается работа с большими объемами данных:
StringWriter writer = new StringWriter();


Запись данных: Каждый вызов метода write() добавляет данные во внутренний буфер, который автоматически увеличивает свою емкость по мере необходимости. Внутренние методы write(char[], int, int) и write(String) управляют записью символов и строк, добавляя их в конец текущего содержимого.
Получение строки: Метод toString() возвращает все содержимое внутреннего буфера в виде строки. Этот метод часто используется, чтобы извлечь данные после завершения записи:

String result = writer.toString();


Методы управления буфером: Методы flush() и close() не выполняют никаких операций, так как StringWriter работает только с внутренним буфером и не требует физического освобождения ресурсов. Однако их вызов возможен для совместимости с другими классами, реализующими интерфейс Writer.

Поля и переменные

Внутренние поля класса StringWriter:

StringBuffer buf — внутренний буфер, в котором хранится содержимое.
boolean closed — флаг, указывающий, был ли объект закрыт методом close() (обычно не используется в стандартных реализациях).


Основные особенности класса StringWriter

Потоковая запись символов: StringWriter поддерживает запись символов, строк и массивов символов, а также позволяет добавлять данные в уже существующую строку.
Внутренний буфер: Внутренний буфер автоматически расширяется по мере необходимости, что делает его использование простым и эффективным даже при работе с большими объемами данных.
Безопасность в многопоточной среде: По умолчанию, класс StringWriter не является потокобезопасным. Если требуется потокобезопасность, можно использовать StringBuffer, а не StringBuilder, как внутренний буфер.
Низкое потребление ресурсов: StringWriter работает исключительно с данными в оперативной памяти, что снижает накладные расходы на ввод-вывод и делает его идеальным выбором для временного хранения и манипуляции строковыми данными.


#Java #Training #Medium #StringWriter
Основные методы класса StringWriter

write(int c) — записывает один символ в буфер.
write(char[] cbuf, int off, int len) — записывает часть массива символов в буфер.
write(String str) — записывает строку в буфер.
write(String str, int off, int len) — записывает подстроку в буфер.
append(CharSequence csq) — добавляет последовательность символов в конец текущего содержимого.
append(CharSequence csq, int start, int end) — добавляет подстроку из последовательности символов.
toString() — возвращает содержимое буфера в виде строки.
getBuffer() — возвращает внутренний StringBuffer, что позволяет выполнять дополнительные манипуляции с данными.
flush() — очищает буфер (в данной реализации не имеет значимого эффекта).
close() — закрывает поток (в данной реализации не имеет значимого эффекта).


Примеры использования StringWriter

Запись строки посимвольно:
import java.io.StringWriter;

public class StringWriterExample {
public static void main(String[] args) {
StringWriter writer = new StringWriter();

// Записываем строку по символам
writer.write('H');
writer.write('e');
writer.write('l');
writer.write('l');
writer.write('o');

// Преобразуем результат в строку
String result = writer.toString();
System.out.println("Result: " + result); // Вывод: "Hello"
}
}
В этом примере мы записываем строку "Hello" посимвольно. Метод write(int c) принимает код символа и добавляет его в буфер.


Запись строки и массива символов:
import java.io.StringWriter;

public class StringWriterStringExample {
public static void main(String[] args) {
StringWriter writer = new StringWriter();

// Записываем строку целиком
writer.write("Hello, ");

// Записываем часть массива символов
char[] chars = {'J', 'a', 'v', 'a'};
writer.write(chars, 0, chars.length);

System.out.println("Output: " + writer.toString()); // Вывод: "Hello, Java"
}
}
В этом примере используется метод write(char[] cbuf, int off, int len), чтобы записать часть массива символов в буфер. Это удобно, если нужно динамически формировать строку из различных фрагментов.


Пример использования append() для объединения строк:
import java.io.StringWriter;

public class StringWriterAppendExample {
public static void main(String[] args) {
StringWriter writer = new StringWriter();

writer.append("Learning ").append("Java ").append("with ").append("StringWriter.");

System.out.println("Output: " + writer.toString()); // Вывод: "Learning Java with StringWriter."
}
}
Метод append() позволяет добавлять строки или части строк к текущему содержимому. Это полезно для конкатенации строковых данных.


Применение StringWriter в реальных проектах

Формирование отчетов и логов: StringWriter часто используется для динамического формирования текстовых отчетов, логов или сообщений об ошибках, которые потом можно записать в файл или вывести в консоль.
Обработка ошибок с помощью PrintWriter: StringWriter часто комбинируется с PrintWriter для записи трассировки стека ошибок (StackTrace). Это позволяет получить стек вызовов в виде строки.
Тестирование ввода-вывода: StringWriter используется в юнит-тестах для проверки методов, использующих объекты типа Writer. Это позволяет подменить вывод на строку и легко анализировать результат.
Создание шаблонов и генерация HTML: Благодаря гибкости записи и управления данными, StringWriter часто используется для создания HTML-шаблонов, генерации XML-документов и других сложных текстовых структур.


#Java #Training #Medium #StringWriter
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
Что выведет код?

public class Task081024 {
enum Status {
START(1), PROCESS(2), FINISH(3);

private int code;

Status(int code) {
this.code = code;
}

int getCode() {
return code;
}
}

public static void main(String[] args) {
Status s1 = Status.START;
Status s2 = Status.FINISH;

if (s1.ordinal() < s2.ordinal()) {
System.out.println("Code1: " + s1.getCode() + ", Code2: " + s2.getCode());
} else {
System.out.println("Code Mismatch");
}

switch (s2) {
case START:
System.out.println("Initial Phase");
break;
case PROCESS:
System.out.println("In Progress");
break;
case FINISH:
System.out.println("Completed");
break;
default:
System.out.println("Unknown");
}
}
}


#Tasks