Реальные проекты и отличная возможность для старта карьеры: Летняя школа бэкенд‑разработки Яндекса открыла набор
Начинающие бэкендеры, есть планы на лето? Летняя школа бэкенда — ваш шанс прокачаться в разработке, даже если вы обладаете базовыми знаниями в Python, Java или C++.
Как проходит обучение:
— со 2 июня по 27 июля — онлайн-лекции, семинары и практические задания
— с 28 июля по 24 августа — разработка реальных проектов офлайн или онлайн
Вас ждут:
— работа в фулстек-командах в коворкингах Яндекса
— лекции от специалистов компании в летнем лектории
— возможность стать частью команды и получить офер: больше половины выпускников становятся стажерами или сотрудниками компании
Школа бесплатная, но нужно пройти отбор. Если у вас есть минимальный опыт в бэкенде и желание стать частью одной из команд сервисов, то отправляйте заявку на обучение до 27 апреля!
Начинающие бэкендеры, есть планы на лето? Летняя школа бэкенда — ваш шанс прокачаться в разработке, даже если вы обладаете базовыми знаниями в Python, Java или C++.
Как проходит обучение:
— со 2 июня по 27 июля — онлайн-лекции, семинары и практические задания
— с 28 июля по 24 августа — разработка реальных проектов офлайн или онлайн
Вас ждут:
— работа в фулстек-командах в коворкингах Яндекса
— лекции от специалистов компании в летнем лектории
— возможность стать частью команды и получить офер: больше половины выпускников становятся стажерами или сотрудниками компании
Школа бесплатная, но нужно пройти отбор. Если у вас есть минимальный опыт в бэкенде и желание стать частью одной из команд сервисов, то отправляйте заявку на обучение до 27 апреля!
Продвинутые дженерики в Java
Если ты уже знаком с базовыми дженериками, пора копнуть глубже:
—> Ограниченные типы (
—> Подстановочные знаки (
—> Стирание типов (
🎩
👉 Java Portal
Если ты уже знаком с базовыми дженериками, пора копнуть глубже:
—> Ограниченные типы (
<T extends Number>
) — позволяют задать верхнюю (или нижнюю) границу для параметра типа.—> Подстановочные знаки (
? extends
, ? super
) — дают гибкость при работе с обобщёнными методами и коллекциями.—> Стирание типов (
type erasure
) — механизм, из-за которого вся информация о типах удаляется во время компиляции, и на этапе выполнения остаются только Object и приведенияPlease open Telegram to view this post
VIEW IN TELEGRAM
Основы 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
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
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
Оптимизация вложенных циклов в Java: пример из реальной практики
🔜 Читать: клик
👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
SpringBoot_Annotations_RU_Linked.pdf
31.5 KB
Полезный PDF с аннотациями Spring и краткими пояснениями на русском
Удобно для повторения и изучения
👉 Java Portal
Удобно для повторения и изучения
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
На фото показана проблема 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
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
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
Коротко о фабричном методе
Начиная с 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
Полезнейшая инфографика для тех, кто работает с Git — всё от основ и ветвлений до разрешения конфликтов и cherry-pick
Сохрани, чтобы не гуглить каждый раз😉
👉 Java Portal
Сохрани, чтобы не гуглить каждый раз
Please open Telegram to view this post
VIEW IN TELEGRAM
БЕСПЛАТНЫЙ курс по 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
Ты используешь 😬
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
Порядок выполнения блоков кода при наследовании в 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
В 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
Что такое 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
Для компилятора 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
Please open Telegram to view this post
VIEW IN TELEGRAM
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