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
Паттерн Состояние (State)

State — это поведенческий паттерн, который позволяет объекту менять свое поведение в зависимости от внутреннего состояния. Вместо множества условных операторов (if-else или switch), каждое состояние представляется отдельным классом, а сам объект делегирует управление текущему состоянию.

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

🟢Когда у объекта есть несколько состояний, и его поведение зависит от текущего состояния.
🟢Когда код с if-else или switch начинает разрастаться и усложняет поддержку.
🟢Когда необходимо четко разделить логику различных состояний и сделать систему более гибкой.

Преимущества

1️⃣Избавляет от множества if-else конструкций, делая код более читаемым и поддерживаемым.
2️⃣Облегчает добавление новых состояний без изменения существующего кода.
3️⃣Обеспечивает инкапсуляцию логики для каждого состояния, упрощая тестирование и модификации.

Недостатки

1️⃣Может усложнить код, если состояний слишком мало, а логика простая.
2️⃣Увеличивает количество классов, так как каждое состояние реализуется отдельно.
3️⃣Вводит дополнительные связи между классами состояний и контекстом.

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

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍138🔥7
Forwarded from Java Guru 🤓
У класса есть два конструктора с разными модификаторами доступа, и один из них помечен @Autowired, какой конструктор будет выбран для инжекта зависимостей?
Anonymous Quiz
5%
Spring вызовет оба конструктора
22%
Если модификатор доступа конструктора с @Autowired - private, Spring выбросит исключение
32%
Spring выберет тот конструктор, у которого модификатор доступа public, даже если нет @Autowired
13%
Код не скомпилируется
🔥7👍53🤩1
🖥OkHttp — это эффективный HTTP-клиент с открытым исходным кодом, разработанный компанией Square для платформ Java и Kotlin!

🌟 Он обеспечивает простоту выполнения HTTP-запросов и обработки ответов, поддерживая современные протоколы, такие как HTTP/2. OkHttp активно используется в Android-разработке и является основой для таких библиотек, как Retrofit.

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

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥43
Что такое микросервисы?

Микросервисы — это архитектурный стиль, при котором приложение разбивается на небольшие, независимые сервисы. Каждый сервис отвечает за определённую бизнес-логику, имеет собственную базу данных (или логически обособленное хранилище) и взаимодействует с другими сервисами через API (обычно REST или gRPC).

🟢Ключевые принципы

Можно обновлять и масштабировать отдельные сервисы без затрагивания всей системы.
Каждый сервис выполняет свою узкую задачу.
У сервиса свои изолированные данные, код и зависимости.
Сервисы общаются через HTTP, AMQP, Kafka и другие механизмы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍193🔥2
Java Streams: Основные методы для чистого и эффективного кода!

Java Streams предлагают множество методов для упрощения манипуляций с данными и повышения читаемости кода.
Вот краткое руководство с примерами:

Освойте эти методы, чтобы писать более чистый и эффективный код на Java! 💡

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84🔥3
🖥 Vert.x — это набор инструментов для создания реактивных приложений на JVM

Ядро Vert.x содержит достаточно низкоуровневую функциональность, включая поддержку HTTP, TCP, доступ к файловой системе и различные другие возможности. Можно использовать Vert.x непосредственно в своих приложениях.

🖥 GitHub
🟡 Доки

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🔥5
🖥 JDK, JRE и JVM

▪️ JDK (Java Development Kit) — это набор инструментов для разработки приложений на Java. Включает компилятор, библиотеки и утилиты, необходимые для написания и сборки кода.

▪️ JRE (Java Runtime Environment) — среда выполнения, которая позволяет запускать Java-приложения. Включает в себя JVM и стандартные библиотеки, но без инструментов разработки.

▪️ JVM (Java Virtual Machine) — виртуальная машина, которая исполняет байт-код, сгенерированный при компиляции. Именно JVM делает Java переносимой, так как позволяет запускать программы на разных платформах.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍4🔥3
Абстракция в Java

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

В Java абстракция реализуется с помощью абстрактных классов и интерфейсов.

Абстрактный класс содержит абстрактные методы без реализации. Подклассы обязаны реализовать эти методы.
Интерфейс задает «контракт», описывая поведение классов без деталей реализации. Классы реализуют интерфейс.

Реализация абстракции требует тщательного анализа предметной области и выделения общих свойств объектов.


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

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

SortedSet имеет несколько дополнительных операций, которые позволяют использовать упорядочение элементов:
— first() и last() возвращают первый и последний элементы в множестве соответственно.
— headSet(), tailSet() и subSet() возвращают подмножества элементов, которые находятся до, после или между заданными элементами соответственно.

В этом примере мы создаем TreeSet (класс, который реализует SortedSet) и добавляем в него несколько строк. Поскольку строки реализуют интерфейс Comparable, они упорядочиваются в алфавитном порядке. Затем мы используем различные методы SortedSet для получения первого и последнего элементов, а также подмножеств элементов.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍144🔥4
⚡️ Как избавиться от задержек и сделать систему быстрее

1️⃣ Кэширование

Временное хранение часто используемых данных в памяти для сокращения времени доступа.

🔘Чем полезно:
- Получение данных из кэша (например, Redis, Memcached) гораздо быстрее, чем запросы к базе данных.
- Кэширование статических ресурсов (изображения, CSS, JS) снижает необходимость многократного запроса их с исходного сервера.

2️⃣ Распределение нагрузки

Распределение входящего сетевого трафика между несколькими серверами для предотвращения перегрузки одного сервера.

🔘Чем полезно:
- Балансировка нагрузки предотвращает перегрузку одного сервера, что может замедлить отклик.
- Обеспечивает отказоустойчивость, гарантируя обработку запросов даже при выходе некоторых серверов из строя.

3️⃣ Асинхронная обработка

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

🔘Чем полезно:
- Пользователям не нужно ждать завершения длительных задач (например, отправки электронной почты или обработки изображений).

4️⃣ Разделение данных (шардирование)

Разделение базы данных на более мелкие части (шарды), которые можно распределить между несколькими серверами.

🔘Чем полезно:
- Запросы могут выполняться параллельно на нескольких шардах, сокращая время получения данных.
- Распределение нагрузки предотвращает перегрузку одного экземпляра базы данных.

5️⃣ Сети доставки контента (CDA)

Распределенные сети серверов, которые доставляют веб-контент на основе географического расположения пользователя.

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

6️⃣ Оптимизация баз данных

Оптимизация работы баз данных через индексацию, оптимизацию запросов и правильное проектирование схемы.

🔘Чем полезно:
- Ускоряет получение данных, позволяя базе данных находить записи без сканирования всех таблиц.

7️⃣ Минимизация сетевых переходов

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

🔘Чем полезно:
- Каждый сетевой переход добавляет задержку; их минимизация ускоряет передачу данных.

8️⃣ Параллельная и конкурентная обработка

Разделение задач на несколько параллельно выполняемых потоков или процессов для увеличения скорости выполнения операций.

🔘Чем полезно:
- Параллельное выполнение задач позволяет обрабатывать данные быстрее за счёт разделения работы на несколько потоков.
- Более эффективное использование ресурсов процессора, что снижает задержки при выполнении сложных операций.

9️⃣ Предварительная и предсказательная загрузка

Предугадывание будущих запросов данных и их предварительная загрузка.

🔘 Чем полезно:
- Данные уже доступны, когда они запрашиваются, устраняя задержки при получении.
- Особенно эффективно в приложениях с предсказуемыми шаблонами доступа.

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

CompletableFuture в пакете java.util.concurrent является классом, который предоставляет мощный и гибкий подход к асинхронному программированию. Он позволяет выполнять асинхронные операции и обрабатывать их результаты, комбинировать несколько операций и управлять зависимостями между ними.

Помимо операций, представленных на изображении, CompletableFuture также предоставляет множество других методов для работы с асинхронными операциями, таких как thenApply(), thenCompose(), thenCombine(), exceptionally() и другие, которые позволяют обрабатывать результаты, комбинировать операции, обрабатывать исключения и многое другое. Это делает CompletableFuture мощным инструментом для асинхронного программирования.


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

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

Пример:

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