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

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
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
В Java лямбда-выражение создаёт экземпляр функционального интерфейса. Во время выполнения этот экземпляр создаётся с помощью класса LambdaMetaFactory

Следующий код на Java создаёт объект Function<String, String>

Function<String, String> f = s -> s.toUpperCase();


Во время выполнения объект создаётся с помощью кода, аналогичного следующему:

@SuppressWarnings("unchecked")
void main() throws Throwable {
MethodHandles.Lookup lookup;
lookup = MethodHandles.lookup();

CallSite callSite;
callSite = LambdaMetafactory.metafactory(
lookup,
"apply",
MethodType.methodType(Function.class),
MethodType.methodType(Object.class, Object.class),
lookup.findStatic(
getClass(),
"lambda",
MethodType.methodType(String.class, String.class)
),
MethodType.methodType(String.class, String.class)
);

MethodHandle target;
target = callSite.getTarget();

Function<String, String> f;
f = (Function<String, String>) target.invokeExact();

String msg;
msg = f.apply("Hello, World!");

IO.println(msg);
}

private static String lambda(String s) {
return s.toUpperCase();
}


При выполнении этот код выведет в консоль HELLO, WORLD! ❤️

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Курс по конкурентному программированию от Ильи Сергеева

Если хочешь разобраться в параллельности, потоках, акторной модели и распределёнке — лови топовый курс от препода Yale-NUS

— Scala для конкурентного кода
— Мьютексы, блокировки, атомики
— Futures и async
— Акторы и обмен сообщениями
— Распределённый консенсус (в т.ч. BFT)

Можешь поблагодарить лукасом 😍

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