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

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
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
This media is not supported in your browser
VIEW IN TELEGRAM
Имбовая библиотека цветов для Kotlin Multiplatform

Если ты пилишь на Kotlin и хочешь красивые цвета под любую платформу — зацени compose-pipette

Поддерживает:

> JVM
> Android (от API 21)
> Kotlin/JS
> Kotlin/WASM
> macOS (пока не тестили)
> iOS (тоже не тестили)

Поддержи пост лайком ❤️

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