Java библиотека
31.6K subscribers
2.34K photos
87 videos
9 files
2.14K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
Агрегация: что это и когда использовать?

Агрегация — это тип отношения между классами, при котором один класс "владеет" экземпляром другого, но их жизненные циклы не зависят друг от друга. Это «слабое» отношение, так как объект одного класса может существовать независимо от объекта другого.

Пример:

class Engine {
void start() {
System.out.println("Двигатель запущен");
}
}

class Car {
private Engine engine;

Car(Engine engine) {
this.engine = engine;
}

void startCar() {
engine.start();
System.out.println("Машина поехала");
}
}

public class Main {
public static void main(String[] args) {
Engine engine = new Engine(); // Двигатель может существовать отдельно
Car car = new Car(engine);
car.startCar();
}
}


🟢В этом примере класс Car агрегирует объект Engine, но двигатель может существовать сам по себе, вне машины.

Агрегацию стоит использовать, когда один объект логически принадлежит другому, но их существование не связано напрямую. Например, библиотека и книги, где книги могут существовать без самой библиотеки

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍317🔥5
🖥 Scoped Values в Java 21

Разберем новую фичу Java 21 — Scoped Values, которая пришла на замену (а точнее, в дополнение) к старому доброму ThreadLocal. Если вы когда-либо мучились с ThreadLocal в многопоточных приложениях, этот пост для вас.

🔽 Проблема ThreadLocal

ThreadLocal — это механизм для хранения данных, привязанных к потоку. Но у него есть недостатки:

— Данные остаются в потоке, даже когда уже не нужны (утечки памяти).
— Передавать данные в дочерние потоки неудобно.
— Нужно очистить данные вручную.

Scoped Values решают эти проблемы без магии и костылей.

⚙️ Как работают Scoped Values

Scoped Values (ScopedValue<T>) создаются только один раз и не изменяются после инициализации. Они передаются вглубь стека вызовов через метод ScopedValue.where(), а не через хранение в потоке, как ThreadLocal.

▪️ Пример кода с потоками


Допустим, есть обработчик запросов, который передает идентификатор пользователя.

— С ThreadLocal код выглядел бы так:
public class ThreadLocalExample {
private static final ThreadLocal<String> USER = new ThreadLocal<>();

public static void main(String[] args) {
USER.set("Alice");
new Thread(ThreadLocalExample::process).start();
}

private static void process() {
System.out.println("User: " + USER.get()); // null: поток не видит значение
}
}


ThreadLocal привязан к потоку, а не к области выполнения. Значение не наследуется

Теперь переделаем на Scoped Values:
public class ScopedValueExample {
private static final ScopedValue<String> USER = ScopedValue.newInstance();

public static void main(String[] args) {
ScopedValue.where(USER, "Alice").run(() -> {
new Thread(ScopedValueExample::process).start();
});
}

private static void process() {
System.out.println("User: " + USER.get()); // Видит "Alice"
}
}


Scoped Values автоматически передают значение в новые потоки.

🎯 Где использовать Scoped Values


1. Контекст запроса (Request Context)
В веб-приложениях часто нужно передавать ID запроса или текущего пользователя через слои сервиса.

2. Логирование (Tracing & Logging)
Можно автоматически передавать traceId в логи.

3. Конфигурация временных параметров
Можно временно менять настройки для фрагмента кода.

🔘Преимущества и недостатки

— ScopedValue быстрее и безопаснее, так как нет необходимости очищать значения вручную.
— Отлично подходит для работы с виртуальными потоками.
— Ограничение: они неизменяемые (Immutable).

Уже использовали? Делитесь опытом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113🔥32
🖥OpenLDK — это JIT-компилятор и среда выполнения Java, полностью реализованные на языке Common Lisp!

🌟 Он переводит Java-байт-код в Lisp, который затем компилируется в машинный код для выполнения. Этот подход позволяет Java-классам интегрироваться с классами системы объектов Common Lisp (CLOS), обеспечивая взаимодействие между кодом на Java и Common Lisp.

🔐 Лицензия: GPL-3.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍155🔥3😁2
⚡️ Параллельные стримы: ускорение или нет?

Java предоставляет мощный инструмент для обработки данных — параллельные стримы. Они позволяют автоматически распределять вычисления по нескольким потокам, но их эффективность зависит от множества факторов.

Добавление parallelStream() бездумно — это не "оптимизация", а лотерея с шансом на баги и падение.

Когда не использовать

— При небольшом наборе данных (<10 000 элементов) затраты на управление потоками могут превышать прирост скорости.
— Операции sorted(), distinct() или limit() требуют полного знания данных, что снижает эффективность параллельного выполнения.
— Вложенные parallelStream() в CompletableFuture или ExecutorService могут привести к конкуренции за ресурсы и неожиданному падению производительности.

✔️ Когда использовать

— Обработка больших объёмов данных (100 000+ элементов).
— Операции независимы и ресурсоёмки, например, сложные вычисления, парсинг файлов, загрузка данных из сети.

🔍 Важная особенность

parallelStream() использует ForkJoinPool.commonPool(). Если есть другие задачи, использующие этот же пул, они могут начать конкурировать за потоки, замедляя всё приложение.

💬 Делитесь в комментах интересными кейсами

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍213🔥3
🖥 Reactify-core — это Java-библиотека, интегрирующаяся с фреймворком Spring Boot, предназначенная для упрощения разработки реактивных бэкенд-систем!

🌟 Она предоставляет готовые модули для аутентификации через Keycloak, работы с хранилищем Minio, реализации OAuth2 безопасности, кэширования, трассировки логов, обработки исключений и валидации.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥2
Что такое JWT?

JWT (JSON Web Token) — это компактный формат токенов для безопасной передачи данных между сторонами. Используется для аутентификации и авторизации, особенно в веб-приложениях.

🟢JWT состоит из трёх частей, разделённых точками

1️⃣ Header — тип токена и алгоритм подписи (например, HMAC или RSA).
2️⃣ Payload — полезная нагрузка (данные, например userId, roles).
3️⃣ Signature — цифровая подпись для защиты от подделки.

⚙️ Как работает

Клиент аутентифицируется, сервер создаёт JWT и отдаёт его клиенту. Затем при каждом запросе клиент передаёт JWT в заголовке Authorization: Bearer <token>. Сервер проверяет подпись и, если токен валиден, разрешает доступ.

⚠️ JWT самодостаточен: сервер не хранит состояние токенов.

💬 Используете JWT в своих проектах?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍202
🖥Pixie — это небольшая библиотека размером около 100 КБ, разработанная для упрощения создания и управления Java-объектами с использованием конфигурации, внедрения зависимостей и обработки событий!

🌟 Она позволяет заменить использование рефлексии при создании объектов, предоставляя более удобный и эффективный способ управления зависимостями и конфигурацией в приложениях.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82🔥2
☄️ Ускоряем @Transactional

При использовании @Transactional Spring Data JPA по умолчанию отслеживает изменения загруженных сущностей для последующей фиксации. Но если вам нужно только чтение, добавьте:
@Transactional(readOnly = true)


Spring Data JPA переводит транзакцию в режим без грязных проверок (no dirty checking), что ускоряет выполнение, так как не отслеживает изменения в загруженных сущностях.

Также БД может оптимизировать запросы, зная, что изменений не будет, особенно СУБД с поддержкой уровня изоляции READ ONLY.

Почему это быстрее

В обычной транзакции Spring Data JPA сохраняет копию каждой загруженной сущности, чтобы сравнить её состояние при коммите и зафиксировать изменения. С readOnly=true эта дорогостоящая операция пропускается, что снижает нагрузку на память и CPU.

📌 Когда использовать

— Сервисы, где нет операций save/update/delete.
— REST-эндпоинты, отдающие справочные данные.
— Запросы к отчетам и аналитике.

⚠️ Если внутри @Transactional(readOnly = true) вызвать метод, изменяющий данные, Spring Data JPA молча проигнорирует изменения

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍32🔥53
🖥 Caffeine — это Java-библиотека для кэширования в памяти, обеспечивающая высокую производительность и оптимальный уровень попаданий в кэш!

🌟 Она предоставляет гибкий и настраиваемый API, позволяющий разработчикам эффективно управлять кэшированием данных в своих приложениях.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥43
⚙️ Live Templates в IntelliJ IDEA

Надоело писать одни и те же конструкции снова и снова? На помощь приходят Live Templates — инструмент, который позволит генерировать фрагменты кода по паре букв.

Live Templates — это заготовки кода, которые можно вставлять по сокращённым ключам. Например, вместо того чтобы каждый раз писать System.out.println(), достаточно написать sout и нажать Enter. IDEA сама развернёт код.

Live Templates поддерживают Java, Kotlin, JS, Groovy, SQL и XML/HTML.

📌 Полезные шаблоны по умолчанию

🟢 sout → System.out.println();
🟢 fori → for (int i=0; i< ; i++) {}
🟢 psvm → public static void main(String[] args) {...}
🟢 ifn → if (obj == null) {}
🟢 prsf → private static final

Полный список live templates: File → Settings→ Editor → Live Templates.

⚙️ Как создать свой шаблон

1️⃣ Открываем File → Settings→ Editor → Live Templates
2️⃣ Выбираем группу или создаём свою.
3️⃣ Нажимаем "+" и задаём аббревиатуру (триггер шаблона).
4️⃣ Пишем в поле Template text код с переменными ($VAR$).
5️⃣ Указываем Context, где шаблон будет работать (Java, SQL, XML и т. д.).
6️⃣ Применяем и тестируем.

Live Templates – это must-have инструмент для ускорения написания кода. Настройте под себя и забудьте про шаблонный код.

💬 Делитесь интересными кастомными шаблонами

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥30👍157
🖥 JDBG — это мощный инструмент для динамической отладки и реверс-инжиниринга Java-приложений!

🌟 Он использует внедрение динамической библиотеки (DLL) вместе с JNI и JVMTI для предоставления глубокого анализа работающих Java-программ.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍225🔥4
Композиция: что это и когда использовать?

Композиция — это тип отношения, когда один класс жёстко связан с другим, и объекты не могут существовать независимо. Если контейнерный объект уничтожается, то и все объекты, которые он содержит, также будут уничтожены.

Пример:

class Heart {
void beat() {
System.out.println("Сердце бьется");
}
}

class Human {
private final Heart heart;

Human() {
this.heart = new Heart(); // Сердце создаётся вместе с человеком
}

void live() {
heart.beat();
System.out.println("Человек живёт");
}
}

public class Main {
public static void main(String[] args) {
Human human = new Human();
human.live();
}
}


🔹 В этом примере класс Human композирует объект Heart, и сердце не может существовать вне человека.

Композицию стоит использовать, когда объекты должны быть тесно связаны и уничтожаться вместе. Например, птица и её крылья — без птицы существование крыльев не имеет смысла.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍176🔥3
🖥 Java Version Almanac — это сайт, который предоставляет подробные данные о каждом выпуске Java, включая новые функции, изменения в API и сравнения между версиями!

🔗 Ссылка: *клик*

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥85
Selector

Класс Selector используется для организации многоканального неблокирующего ввода-вывода.
Основная идея в том, что Selector позволяет одному потоку следить за состоянием множества каналов (сокетов, файловых каналов) и обрабатывать их события (готовность к чтению/записи).

Возможности Selector:
— Регистрация множества каналов в Selector для мониторинга.
— Проверка готовности зарегистрированных каналов к операциям чтения, записи.
— Извлечение готовых каналов и выполнение операций с ними.
— Отмена регистрации каналов в Selector.

Использование Selector позволяет избежать блокировки на операциях чтения/записи по каналам и эффективно масштабировать приложение для одновременной работы с большим количеством соединений.
Класс часто применяется в сетевых серверах для неблокирующей обработки большого числа клиентских соединений в одном потоке.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍115🔥3
Media is too big
VIEW IN TELEGRAM
Java и gRPC: быстрый старт со Spring Boot | Преимущества, Настройка и Использование

Сегодня у нас QuickStart и обзор ныне очень популярной технологии - gRPC, оставляйте свое мнение в комментариях и читайте описание, приятного! :)

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍173🔥2
Как отслеживать изменения в файловой системе в реальном времени

Если вам нужно отслеживать изменения в файловой системе, такие как добавление, удаление или модификация файлов, Java предоставляет удобный инструмент — интерфейс WatchService. Это идеальное решение для мониторинга директорий без необходимости вручную проверять состояние файлов каждый раз.

🟢Возможные сценарии использования:
- Отслеживание действий пользователя.
- Мониторинг изменений в конфигурационных файлах для их динамической перезагрузки.
- Автоматическая обработка данных, как только они поступают в систему (например, новые изображения или документы).
- Логирование и анализ активности в системных директориях.

import java.nio.file.*;
import java.io.IOException;

public class DirectoryWatcher {
public static void main(String[] args) throws IOException, InterruptedException {
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get("/path/to/watch");
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);

System.out.println("Monitoring directory: " + path);

while (true) {
WatchKey key = watchService.take();
key.pollEvents().forEach(event -> {
WatchEvent.Kind<?> kind = event.kind();
System.out.println(kind.name() + ": " + event.context());
});
if (!key.reset()) break;
}
}
}


WatchService — это механизм мониторинга событий файловой системы. Для его работы регистрируем путь для отслеживания событий с помощью path.register() и указываем тип событий: создание, удаление или модификация.
В бесконечном цикле программа ожидает события с помощью watchService.take(), после чего события обрабатываются через лямбду.
Метод reset() проверяет, можно ли продолжить отслеживание, если нет — цикл завершится.

🟢Преимущества использования:
- Моментальное реагирование на изменения файлов, что упрощает автоматизацию.
- Легкая настройка — всего несколько строк кода для полного мониторинга директории.
- Минимальные ресурсы — WatchService не требует постоянного опроса файловой системы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍105🔥4
StringBuilder

StringBuilder — это класс для работы с изменяемыми строками, аналогичный StringBuffer. API класса StringBuilder такой же, как у StringBuffer, он также хранит строку в виде модифицируемого массива символов.

Но, в отличие от StringBuffer, StringBuilder не является потокобезопасным. Он работает быстрее за счет отсутствия синхронизации.
Поэтому его рекомендуется использовать в однопоточных приложениях для работы со строками, когда нет необходимости в синхронизации.

При создании можно задать начальную емкость buffer'а в виде размера массива символов.
Если строка превышает текущую емкость, она автоматически расширяется с сохранением содержимого.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42🔥2
🖥 segmantix — это библиотека для Java, предназначенная для управления многоуровневым доступом к данным на уровне пользователей, ролей и арендаторов!

🌟 Основанная на JPA и slf4j-api, она обеспечивает детализированный контроль доступа, позволяя настраивать разрешения для операций, таких как чтение, запись и удаление.

🔐 Лицензия: Apache-2.0

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥2
Что такое авторизация и аутентификация?

🟢Аутентификация — процесс проверки подлинности субъекта (пользователя или системы) на основе предоставленных им учетных данных (например, пары логин/пароль, сертификата или токена). Она подтверждает, что субъект является тем, за кого себя выдаёт.

🟢Авторизация — процесс определения прав и привилегий аутентифицированного субъекта в рамках определённой системы или ресурса. Она определяет, какие действия или ресурсы доступны субъекту после успешной аутентификации.

Аутентификация устанавливает личность субъекта, а авторизация — его полномочия в системе.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍174🔥4