Основы Java Enum
Синтаксис:👇
⏩ Все значения — это константы
⏩ Java преобразует их в
Особенности
—> Перечисления (enums) не могут наследовать другие классы, так как уже наследуют
—> Enum может реализовывать интерфейсы
—> Конструкторы могут быть только приватными, иначе будет выброшено исключение
Пример Enum с конструктором на фото☕️
👉 Java Portal | #cтатья
Синтаксис:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public static final
переменныеОсобенности
—> Перечисления (enums) не могут наследовать другие классы, так как уже наследуют
java.lang.Enum
—> Enum может реализовывать интерфейсы
—> Конструкторы могут быть только приватными, иначе будет выброшено исключение
Пример Enum с конструктором на фото
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍6🔥2
ModelMapper — автоматическое отображение объектов в Java
Устали писать вручную мапперы между Entity и DTO?
ModelMapper сделает это за вас😱
—> Это лёгкая библиотека для Java, которая упрощает маппинг объектов.
—> Идеально подходит для REST API: быстро конвертируйте сущности в DTO и обратно.
—> Поддерживает вложенные объекты, конфигурацию и даже сложные правила сопоставления
👉 Java Portal
Устали писать вручную мапперы между Entity и DTO?
ModelMapper сделает это за вас
—> Это лёгкая библиотека для Java, которая упрощает маппинг объектов.
—> Идеально подходит для REST API: быстро конвертируйте сущности в DTO и обратно.
—> Поддерживает вложенные объекты, конфигурацию и даже сложные правила сопоставления
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍4🔥1
image_2025-04-18_09-03-49.png
1.5 MB
Что такое MapStruct?
MapStruct — это мощный процессор аннотаций для Java, который автоматически генерирует мапперы между объектами прямо на этапе компиляции
Очень быстрый, безопасный по типам и отлично работает в IDE
Идеально подходит для преобразования между Entity и DTO в REST API😊
👉 Java Portal
MapStruct — это мощный процессор аннотаций для Java, который автоматически генерирует мапперы между объектами прямо на этапе компиляции
Очень быстрый, безопасный по типам и отлично работает в IDE
Идеально подходит для преобразования между Entity и DTO в REST API
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3❤2
Оптимизация вложенных циклов в Java: пример из реальной практики
🔜 Читать: клик
👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🏆2🔥1
SpringBoot_Annotations_RU_Linked.pdf
31.5 KB
Полезный PDF с аннотациями Spring и краткими пояснениями на русском
Удобно для повторения и изучения
👉 Java Portal
Удобно для повторения и изучения
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2🔥2
На фото показана проблема N+1 в JPA и её решение.
🟣
☑
Показана разница в коде и как избежать лишних запросов при загрузке связанных сущностей (Author → Book)
👉 Java Portal
findAll()
— вызывает 1 запрос к авторам + по 1 запросу на книги каждого автора → N+1 запросовJOIN FETCH
в @Query
— решает проблему, загружая авторов и их книги одним SQL-запросомПоказана разница в коде и как избежать лишних запросов при загрузке связанных сущностей (Author → Book)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3😁1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
8 алгоритмов балансировки нагрузки, которые стоит знать:
🍩 Round Robin – запросы распределяются равномерно между серверами по очереди.
🍩 Least Connections – запрос направляется на сервер с наименьшим числом активных соединений.
🍩 Weighted Round Robin – серверам присваиваются веса, и запросы распределяются с учетом этих весов.
🍩 Weighted Least Connections – учитывается как число соединений, так и вес сервера.
🍩 IP Hash - запрос направляется на сервер в зависимости от хэша IP-адреса клиента.
🍩 Least Response Time – запрос идет на сервер с наименьшим временем ответа.
🍩 Random – сервер выбирается случайным образом.
🍩 Least Bandwidth – запрос идет на сервер с наименьшей текущей загрузкой сети.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5🔥2😁1
image_2025-04-22_06-02-27.png
578.5 KB
Простое объяснение паттерна Фабрика
Вы создаёте уведомления. Сначала у вас только
Потом появляются другие типы:
⏩ SMSNotification
⏩ PushNotification
⏩ SlackNotification
⏩ WhatsAppNotification
Появляется дублирующийся код:
Проблемы:
—> Повтор кода.
—> Нарушение принципа Open/Closed.
—> Жёсткая связка с классами.
—> Сложно тестировать и расширять.
Как фабрика вас спасает
Вместо создания объектов напрямую или написания
Фабрика:
—> Скрывает логику создания
—> Решает, какой подкласс вернуть
—> Делает основной код чистым и слабо связанным
Теперь вам всё равно, как он создаётся. Вы просто запрашиваете и получаете готовый объект
Пример кода на фото😊
👉 Java Portal
Вы создаёте уведомления. Сначала у вас только
EmailNotification
:new EmailNotification(to, subject, body);
Потом появляются другие типы:
Появляется дублирующийся код:
if (type.equals("email")) new EmailNotification(...)
else if (type.equals("sms")) new SMSNotification(...)
...
Проблемы:
—> Повтор кода.
—> Нарушение принципа Open/Closed.
—> Жёсткая связка с классами.
—> Сложно тестировать и расширять.
Как фабрика вас спасает
Вместо создания объектов напрямую или написания
switch/if
, вы создаёте NotificationFactory
Фабрика:
—> Скрывает логику создания
—> Решает, какой подкласс вернуть
—> Делает основной код чистым и слабо связанным
Теперь вам всё равно, как он создаётся. Вы просто запрашиваете и получаете готовый объект
Пример кода на фото
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥1
Коротко о фабричном методе
Начиная с JDK 19, класс HashMap предоставляет новый фабричный метод:
В этом примере возвращаемая карта будет достаточно большой, чтобы вместить 10 отображений. У неё значение коэффициента загрузки по умолчанию — 0.75. Поэтому фактическая вместимость (capacity) будет больше, чем переданный аргумент 10. Вместимость вычисляется как:
Это отличается от конструктора:
В этом случае аргумент 10 — это начальная вместимость (фактическая вместимость будет степенью двойки).
Также важно: фабричный метод внутри вызывает конструктор🔧
Java Portal
HashMap::newHashMap
Начиная с JDK 19, класс HashMap предоставляет новый фабричный метод:
var map = HashMap.<Key, String>newHashMap(10);
В этом примере возвращаемая карта будет достаточно большой, чтобы вместить 10 отображений. У неё значение коэффициента загрузки по умолчанию — 0.75. Поэтому фактическая вместимость (capacity) будет больше, чем переданный аргумент 10. Вместимость вычисляется как:
10 <-- количество отображений
capacity = -----
0.75 <-- коэффициент загрузки
Это отличается от конструктора:
var map = new HashMap<Key, String>(10);
В этом случае аргумент 10 — это начальная вместимость (фактическая вместимость будет степенью двойки).
Также важно: фабричный метод внутри вызывает конструктор
Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🌭1
Полезнейшая инфографика для тех, кто работает с Git — всё от основ и ветвлений до разрешения конфликтов и cherry-pick
Сохрани, чтобы не гуглить каждый раз😉
👉 Java Portal
Сохрани, чтобы не гуглить каждый раз
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4
БЕСПЛАТНЫЙ курс по backend-разработке на Java
Начни с основ Java и ООП
—> Коллекции, Исключения, Работа с файлами (I/O)
—> JDBC, MySQL
—> Spring Boot 3, REST API
—> Аутентификация с JWT, Docker + практические проекты😱
⏩ начать
👉 Java Portal
Начни с основ Java и ООП
—> Коллекции, Исключения, Работа с файлами (I/O)
—> JDBC, MySQL
—> Spring Boot 3, REST API
—> Аутентификация с JWT, Docker + практические проекты
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍3🔥2
Ты используешь 😬
1.
2.
3.
👉 Java Portal
CompletableFuture
, но где-то по ходу выполнения возникает исключение. Как с ним справиться? CompletableFuture
предоставляет 3 способа обработки исключений 1.
exceptionally()
— этот метод принимает функцию обработки ошибки, которая выполняется, когда происходит исключение. Здесь у нас есть доступ только к ошибке, но не к данным, возвращённым с предыдущего этапа.2.
handle()
— этот метод принимает результат и исключение и выполняется всегда после завершения предыдущего этапа. Это может быть как в случае успешного выполнения, так и при возникновении исключений.3.
whenComplete()
— метод похож на handle()
, но не изменяет результат. Он возвращает CompletableFuture
и может быть использован в цепочке. Используется для выполнения побочных действий после завершения, вне зависимости от результатаPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤4👍3
Порядок выполнения блоков кода при наследовании в Java
1. Статический блок родителя
2. Статический блок потомка
3. Инициализационный (instance) блок родителя
4. Конструктор родителя
5. Инициализационный (instance) блок потомка
6 Конструктор потомка
При создании объекта класса-наследника сначала выполняются все статические и инициализационные блоки родителя, затем конструкция родителя, и только после этого — логика наследника😊
Java Portal
1. Статический блок родителя
2. Статический блок потомка
3. Инициализационный (instance) блок родителя
4. Конструктор родителя
5. Инициализационный (instance) блок потомка
6 Конструктор потомка
При создании объекта класса-наследника сначала выполняются все статические и инициализационные блоки родителя, затем конструкция родителя, и только после этого — логика наследника
Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥9❤2
В Java ключевые слова бывают двух типов: зарезервированные и контекстные.
Зарезервированные ключевые слова нельзя использовать, например, для имени метода — метод с именем
Контекстные ключевые слова, напротив, можно использовать в качестве идентификаторов в большинстве случае
Начиная с Java 24, контекстные ключевые слова включают следующие:
Их можно использовать почти везде, где допустимо имя идентификатора
👉 Java Portal
Зарезервированные ключевые слова нельзя использовать, например, для имени метода — метод с именем
try
не скомпилируетсяКонтекстные ключевые слова, напротив, можно использовать в качестве идентификаторов в большинстве случае
Начиная с Java 24, контекстные ключевые слова включают следующие:
exports opens requires uses yield
module permits sealed var
non-sealed provides to when
open record transitive with
Их можно использовать почти везде, где допустимо имя идентификатора
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Что такое Docker? 🤷♂️
Слово Docker происходит от «dock worker» — это работник порта, который загружает и разгружает контейнеры с кораблей. Именно отсюда и пошло название «Docker»
С помощью Docker можно реализовать технологии контейнеризации — изолировать приложения вместе со всеми их зависимостями, чтобы они стабильно работали в любой среде
Контейнеризация — это концепция, с помощью которой мы можем упаковать программное приложение вместе со всеми необходимыми библиотеками и бинарниками для его запуска. Такая упаковка называется образом (image)
Docker — это инструмент, который упрощает процесс создания и запуска контейнеров на основе этих образов
Можно сказать: образ — это как JAR-файл, а контейнер — это уже запущенное приложение
👉 Java Portal
Слово Docker происходит от «dock worker» — это работник порта, который загружает и разгружает контейнеры с кораблей. Именно отсюда и пошло название «Docker»
С помощью Docker можно реализовать технологии контейнеризации — изолировать приложения вместе со всеми их зависимостями, чтобы они стабильно работали в любой среде
Контейнеризация — это концепция, с помощью которой мы можем упаковать программное приложение вместе со всеми необходимыми библиотеками и бинарниками для его запуска. Такая упаковка называется образом (image)
Docker — это инструмент, который упрощает процесс создания и запуска контейнеров на основе этих образов
Можно сказать: образ — это как JAR-файл, а контейнер — это уже запущенное приложение
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍5🤣3😁2
Для компилятора Java аннотации — это просто модификаторы объявления
Это значит, что их можно ставить до, после или между обычными модификаторами (например public, final и т.д.).
Причём это относится не только к методам, но и к другим сущностям: типам, конструкторам, полям, параметрам и локальным переменным.
Многие думают, что метод можно аннотировать только вот так:
Но на самом деле все эти варианты работают одинаково:
Все три записи синтаксически корректны и эквивалентны, компилятору всё равно, где стоит аннотация, он воспринимает её как модификатор😉
👉 Java Portal
Это значит, что их можно ставить до, после или между обычными модификаторами (например public, final и т.д.).
Причём это относится не только к методам, но и к другим сущностям: типам, конструкторам, полям, параметрам и локальным переменным.
Многие думают, что метод можно аннотировать только вот так:
@Override
public final String toString() {
return "Annotations are just modifiers";
}
Но на самом деле все эти варианты работают одинаково:
public @Override final String toString() ...
public final @Override String toString() ...
Все три записи синтаксически корректны и эквивалентны, компилятору всё равно, где стоит аннотация, он воспринимает её как модификатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤4🤣3🤯2
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣6👍4
image_2025-04-27_06-48-52.png
415.9 KB
Простое объяснение паттерна Singleton
Ситуация: Вы создаете менеджер подключения к базе данных
Вам нужно подключить ваше приложение к базе данных.
Просто. Вы пишете:
И всё круто.
Но потом разные части приложения начинают плодить свои собственные соединения. Это дорого (память, сеть) и приводит к багам вроде гонок данных и грязных чтений.
Теперь вы застряли в дебаггинге странных ошибок, причина которых в том, что у вас несколько экземпляров объекта, который должен был быть только один
Проблемы:
⏩ Много экземпляров вместо одного общего.
⏩ Трата ресурсов.
⏩ Нестабильное поведение.
⏩ Отладка превращается в ад.
Как Singleton спасает ситуацию
⏩ Создаём экземпляр один раз
⏩ Переиспользуем везде
⏩ Контролируем доступ через одну глобальную точку
Когда использовать:
— Когда нужен только один объект (БД, логгер, менеджер потоков)
— Когда нужен глобальный доступ
— Когда важно беречь ресурсы
Java Portal
Ситуация: Вы создаете менеджер подключения к базе данных
Вам нужно подключить ваше приложение к базе данных.
Просто. Вы пишете:
DatabaseConnection conn = new DatabaseConnection();
И всё круто.
Но потом разные части приложения начинают плодить свои собственные соединения. Это дорого (память, сеть) и приводит к багам вроде гонок данных и грязных чтений.
Теперь вы застряли в дебаггинге странных ошибок, причина которых в том, что у вас несколько экземпляров объекта, который должен был быть только один
Проблемы:
Как Singleton спасает ситуацию
class DatabaseConnection {
private static DatabaseConnection instance;
private DatabaseConnection() {
System.out.println("Connecting to database...");
}
public static synchronized DatabaseConnection getInstance() {
if (instance == null) {
instance = new DatabaseConnection();
}
return instance;
}
public void query(String sql) {
System.out.println("Running query: " + sql);
}
}
Когда использовать:
— Когда нужен только один объект (БД, логгер, менеджер потоков)
— Когда нужен глобальный доступ
— Когда важно беречь ресурсы
Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Откопал шикарную штуку — Python Tutor
Пишете код на Python, Java, C, C++ или JavaScript прямо в браузере, а этот сервис пошагово показывает, что происходит под капотом. Видно каждую переменную, каждую строчку кода в действии
Плюс, тут есть AI-репетитор для разъяснений
Годный инструмент для обучения или разборов: https://pythontutor.com/
👉 Java Portal
Пишете код на Python, Java, C, C++ или JavaScript прямо в браузере, а этот сервис пошагово показывает, что происходит под капотом. Видно каждую переменную, каждую строчку кода в действии
Плюс, тут есть AI-репетитор для разъяснений
Годный инструмент для обучения или разборов: https://pythontutor.com/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥5🤣4😁1🤯1