Java Portal | Программирование
11.5K subscribers
829 photos
62 videos
21 files
632 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
spring_boot_vs_micronaut_compact.pdf
30.2 KB
Spring Boot против Micronaut

В PDF cравнили ключевые плюсы и минусы

🕵️‍♂️🕵️‍♂️

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-04-27_06-48-52.png
415.9 KB
Простое объяснение паттерна Singleton

Ситуация: Вы создаете менеджер подключения к базе данных

Вам нужно подключить ваше приложение к базе данных.

Просто. Вы пишете:

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
Лучшие практики программирования на Java

🔜 Читать: клик

👉 Java Portal | #cтатья
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Как вызвать java.lang.ClassCircularityError в Java

JVM выбрасывает 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)


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Недавно открыл для себя learn.java — официальный сайт от Oracle для изучения Java. Здесь всё чётко и по делу 😈

> Установка JDK и настройка IDE
> Пошаговые уроки по основам Java
> Практические задания в онлайн-редакторе
> Мини-проекты для закрепления знаний
> Дополнительные ресурсы для углубленного обучения

Плюс — есть Java Playground, где можно писать и запускать код прямо в браузере, без лишних установок

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Component → Controller → Service → Repository → База данных → Ответ

Так проходит поток данных в приложении Spring Boot — чисто и по слоям

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Многопоточность в Java

Есть основной метод, а вместе с ним — несколько потоков

Каждый поток выполняет свою задачу одновременно с другими

Это даёт прирост в скорости и производительности.

Полезно, когда нужно делать несколько вещей сразу — например, загружать файлы или обслуживать пользователей

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Модификаторы и пакеты доступа Java

🔜 Читать: клик

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации @OneToMany и @ManyToOne помогают определить связи между сущностями в базе данных

Пример:

Пользователь может иметь много заказов →

@OneToMany(mappedBy = "user")
private List<Order> orders;


Каждый заказ принадлежит одному пользователю →

@ManyToOne
@JoinColumn(name = "user_id")
private User user;


👉 Java Portal
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
Pattern Matching в switch — Java

🔜 Читать: клик

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Дорожная карта Spring Boot для 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 | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
Хочешь, чтобы Swagger UI был доступен без авторизации в Spring Boot?

Просто добавь его в белый список:

.antMatchers("/swagger-ui/", "/v3/api-docs/").permitAll()


Так разработчики смогут спокойно тестировать и изучать API без входа в систему

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Шпаргалка по Map-реализациям

Если путаешься в HashMap, TreeMap, ConcurrentHashMap — лови таблицу сравнения

> HashMap — быстрая, но не потокобезопасная. Подходит для общего использования
> LinkedHashMap — сохраняет порядок вставки
> TreeMap — сортирует по ключам.
> Hashtable — потокобезопасна, но старая и медленная
> ConcurrentHashMap — оптимальна для многопоточности
> EnumMap — супербыстрая для enum-ключей
> IdentityHashMap — использует == вместо .equals()
> WeakHashMap — ключи могут быть удалены GC. Полезно для кэшей

Не забывай про null-ключи, производительность, порядок —> всё это влияет на выбор структуры данных 💖

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Strategy Pattern без занудства

Ситуация: вы пишете платёжную систему

У вас есть PaymentService, поддерживающий оплату кредитной картой.

Вы пишете:

public void pay(String method) {
if (method.equals("creditcard")) {
// логика оплаты кредиткой
}
}


Потом добавляют PayPal, UPI, крипту, Apple Pay, кошельки, NetBanking и тд.. 😢

Теперь ваш метод выглядит вот так:

if (method.equals("creditcard")) {
// логика кредитки
} else if (method.equals("paypal")) {
// логика PayPal
} else if ...


Вы тонете в аду if-else. Каждый раз при добавлении нового способа оплаты:

> Вы трогаете старый код
> Рискуете сломать существующую логику
> Нельзя нормально протестировать стратегии
> Нарушается принцип OCP (Open/Closed)

В чём настоящая проблема?

1. Ваш код слишком жёстко связан с конкретными реализациями оплат
2. Добавление новых стратегий требует изменения существующего кода
3. Тестировать/переиспользовать отдельные стратегии — сложно
4. PaymentService теперь отвечает за слишком многое

Как Strategy Pattern вас спасает

1. Создаёшь интерфейс PaymentStrategy
2. Для каждой оплаты — свой класс: CreditCardPayment, PayPalPayment, UPIPayment
3. PaymentService просто вызывает .pay() на нужной стратегии

Добавить новый способ? Просто пишешь новый класс
Никаких if-else
Стратегии изолированы и легко тестируются

interface PaymentStrategy {
void pay(int amount);
}

class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Плачу " + amount + " с помощью кредитки");
}
}

class PayPalPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Плачу " + amount + " через PayPal");
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM