Полезнейшая инфографика для тех, кто работает с 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
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Как вызвать
JVM выбрасывает
Такую ошибку можно спровоцировать, если скомпилировать классы в два этапа или сгенерировать их во время выполнения.
Пример через компиляцию:
Создаем три файла:
Выполняем команды:
На этапе запуска получите ошибку:
👉 Java Portal
java.lang.ClassCircularityError
в JavaJVM выбрасывает
java.lang.ClassCircularityError
, если при загрузке классов обнаруживает циклическую зависимость, например:class A extends B {}
class B extends A {}
Такую ошибку можно спровоцировать, если скомпилировать классы в два этапа или сгенерировать их во время выполнения.
Пример через компиляцию:
Создаем три файла:
// A.java
public class A extends B {}
class B {}
// B.java
public class B extends A {}
class A {}
// Run.java
void main() {
new A();
}
Выполняем команды:
mkdir step{1..3}
javac -d step1 A.java
javac -d step2 B.java
cp step1/A.class step3/
cp step2/B.class step3/
rm A.java B.java
java --enable-preview -cp step3/ Run.java
На этапе запуска получите ошибку:
Exception in thread "main" java.lang.ClassCircularityError: A
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:962)
...
at Run.main(Run.java:2)
Please open Telegram to view this post
VIEW IN TELEGRAM
Недавно открыл для себя learn.java — официальный сайт от Oracle для изучения Java. Здесь всё чётко и по делу 😈
> Установка JDK и настройка IDE
> Пошаговые уроки по основам Java
> Практические задания в онлайн-редакторе
> Мини-проекты для закрепления знаний
> Дополнительные ресурсы для углубленного обучения
Плюс — есть Java Playground, где можно писать и запускать код прямо в браузере, без лишних установок
👉 Java Portal
> Установка JDK и настройка IDE
> Пошаговые уроки по основам Java
> Практические задания в онлайн-редакторе
> Мини-проекты для закрепления знаний
> Дополнительные ресурсы для углубленного обучения
Плюс — есть Java Playground, где можно писать и запускать код прямо в браузере, без лишних установок
Please open Telegram to view this post
VIEW IN TELEGRAM
Component → Controller → Service → Repository → База данных → Ответ
Так проходит поток данных в приложении Spring Boot — чисто и по слоям
👉 Java Portal
Так проходит поток данных в приложении Spring Boot — чисто и по слоям
Please open Telegram to view this post
VIEW IN TELEGRAM
Многопоточность в Java
Есть основной метод, а вместе с ним — несколько потоков
Каждый поток выполняет свою задачу одновременно с другими
Это даёт прирост в скорости и производительности.
Полезно, когда нужно делать несколько вещей сразу — например, загружать файлы или обслуживать пользователей
👉 Java Portal
Есть основной метод, а вместе с ним — несколько потоков
Каждый поток выполняет свою задачу одновременно с другими
Это даёт прирост в скорости и производительности.
Полезно, когда нужно делать несколько вещей сразу — например, загружать файлы или обслуживать пользователей
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации
Пример:
Пользователь может иметь много заказов →
Каждый заказ принадлежит одному пользователю →
👉 Java Portal
@OneToMany
и @ManyToOne
помогают определить связи между сущностями в базе данныхПример:
Пользователь может иметь много заказов →
@OneToMany(mappedBy = "user")
private List<Order> orders;
Каждый заказ принадлежит одному пользователю →
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
Please open Telegram to view this post
VIEW IN TELEGRAM
Как синхронизировать двунаправленные ассоциации сущностей с помощью JPA и Hibernate
🔜 Читать: клик
👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM