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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Хочешь, чтобы Swagger UI был доступен без авторизации в Spring Boot?
Просто добавь его в белый список:
Так разработчики смогут спокойно тестировать и изучать API без входа в систему
👉 Java Portal
Просто добавь его в белый список:
.antMatchers("/swagger-ui/", "/v3/api-docs/").permitAll()
Так разработчики смогут спокойно тестировать и изучать API без входа в систему
Please open Telegram to view this post
VIEW IN TELEGRAM
Шпаргалка по Map-реализациям
Если путаешься в
> HashMap — быстрая, но не потокобезопасная. Подходит для общего использования
> LinkedHashMap — сохраняет порядок вставки
> TreeMap — сортирует по ключам.
> Hashtable — потокобезопасна, но старая и медленная
> ConcurrentHashMap — оптимальна для многопоточности
> EnumMap — супербыстрая для enum-ключей
> IdentityHashMap — использует
> WeakHashMap — ключи могут быть удалены GC. Полезно для кэшей
Не забывай про null-ключи, производительность, порядок —> всё это влияет на выбор структуры данных💖
👉 Java Portal
Если путаешься в
HashMap, TreeMap, ConcurrentHashMap
— лови таблицу сравнения> HashMap — быстрая, но не потокобезопасная. Подходит для общего использования
> LinkedHashMap — сохраняет порядок вставки
> TreeMap — сортирует по ключам.
> Hashtable — потокобезопасна, но старая и медленная
> ConcurrentHashMap — оптимальна для многопоточности
> EnumMap — супербыстрая для enum-ключей
> IdentityHashMap — использует
==
вместо .equals()
> WeakHashMap — ключи могут быть удалены GC. Полезно для кэшей
Не забывай про null-ключи, производительность, порядок —> всё это влияет на выбор структуры данных
Please open Telegram to view this post
VIEW IN TELEGRAM
Strategy Pattern без занудства
Ситуация: вы пишете платёжную систему
У вас есть
Вы пишете:
Потом добавляют PayPal, UPI, крипту, Apple Pay, кошельки, NetBanking и тд..😢
Теперь ваш метод выглядит вот так:
Вы тонете в аду
> Вы трогаете старый код
> Рискуете сломать существующую логику
> Нельзя нормально протестировать стратегии
> Нарушается принцип OCP (Open/Closed)
В чём настоящая проблема?
1. Ваш код слишком жёстко связан с конкретными реализациями оплат
2. Добавление новых стратегий требует изменения существующего кода
3. Тестировать/переиспользовать отдельные стратегии — сложно
4.
Как Strategy Pattern вас спасает
1. Создаёшь интерфейс PaymentStrategy
2. Для каждой оплаты — свой класс:
3.
☑ Добавить новый способ? Просто пишешь новый класс
☑ Никаких
☑ Стратегии изолированы и легко тестируются
👉 Java Portal
Ситуация: вы пишете платёжную систему
У вас есть
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");
}
}
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
Если ты пилишь на Kotlin и хочешь красивые цвета под любую платформу — зацени compose-pipette
Поддерживает:
> JVM
> Android (от API 21)
> Kotlin/JS
> Kotlin/WASM
> macOS (пока не тестили)
> iOS (тоже не тестили)
Поддержи пост лайком
Please open Telegram to view this post
VIEW IN TELEGRAM
В Java лямбда-выражение создаёт экземпляр функционального интерфейса. Во время выполнения этот экземпляр создаётся с помощью класса
Следующий код на Java создаёт объект
Во время выполнения объект создаётся с помощью кода, аналогичного следующему:
При выполнении этот код выведет в консоль❤️
👉 Java Portal
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!
Please open Telegram to view this post
VIEW IN TELEGRAM