Please open Telegram to view this post
VIEW IN TELEGRAM
🤣30🔥3🏆3
Совет по Java Spring Boot
Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
Чтобы этого избежать и не ломать API, добавь аннотацию:
👉 Java Portal
Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
UnrecognizedPropertyException.Чтобы этого избежать и не ломать API, добавь аннотацию:
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Поставлено в JDK 22: JEP 454 добавил в Java стандартный API для работы с внешними функциями и памятью. Вызов нативного кода больше не обязан начинаться с шаблонного кода JNI. Небольшой пример 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
JavaDoc получил реальное улучшение удобства использования в Java 24.
Парень написал практический туториал, который показывает, как использовать JavaDoc с Markdown через комментарии
http://buff.ly/RmaVWSt
#Java #Java24 #Javadoc #Maven
👉 Java Portal
Парень написал практический туториал, который показывает, как использовать JavaDoc с Markdown через комментарии
/// в небольшой библиотеке на Maven + JUnit, включая документацию пакетов, записи, запечатанные типы, генерацию JavaDoc и всплывающие подсказки в IDE.http://buff.ly/RmaVWSt
#Java #Java24 #Javadoc #Maven
Please open Telegram to view this post
VIEW IN TELEGRAM
The-Main-Thread
Write Better JavaDoc in Java 24 with Markdown Comments
Build a small Java library with Maven and JUnit, replace classic JavaDoc with /// Markdown comments, and generate cleaner API docs for humans and AI tools.
❤4
This media is not supported in your browser
VIEW IN TELEGRAM
Вы предпочитаете аккуратно отформатированные текстовые блоки для аннотаций запросов при использовании Spring Data?
https://spring.io/tools теперь умеет генерировать именно такие при преобразовании AOT-метаданных репозитория в аннотации запросов
👉 Java Portal
https://spring.io/tools теперь умеет генерировать именно такие при преобразовании AOT-метаданных репозитория в аннотации запросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Java Generics — всё, что нужно знать
1.
• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).
2.
• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).
3.
• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).
4.
• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).
5.
• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).
6.
• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).
7.
• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление
8. Правило PECS
• Producer Extends, Consumer Super.
• Используй
9.
• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).
10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать
11. Обобщённый конструктор
• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).
12. Обобщённый интерфейс
• Используй при преобразовании одного типа в другой (например, DTO → сущность).
13. Нельзя использовать примитивы
• Нельзя
• Используй обёртки (коллекции могут хранить только объекты, не примитивы).
14. Нельзя создавать массивы с обобщением
•
• Используй
15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в
• Используй
👉 Java Portal
1.
Box<T> → Обобщённый класс• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).
2.
<T> void print(T val) → Обобщённый метод• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).
3.
<T extends Number> → Ограниченный тип• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).
4.
<T extends A & B> → Несколько ограничений• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).
5.
<?> → Неограниченный подстановочный тип• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).
6.
<? extends T> → Верхняя граница подстановочного типа• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).
7.
<? super T> → Нижняя граница подстановочного типа• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление
Integer в List<? super Integer>).8. Правило PECS
• Producer Extends, Consumer Super.
• Используй
extends для чтения, super для записи (например, API-вход против обработки ответа).9.
List list = new ArrayList(); → Сырой тип• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).
10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать
T.class, new T(), или instanceof T (например, нельзя делать проверки или создавать объекты на основе T).11. Обобщённый конструктор
<T> MyClass(T val) { }• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).
12. Обобщённый интерфейс
interface Mapper<F, T> { T map(F input); }• Используй при преобразовании одного типа в другой (например, DTO → сущность).
13. Нельзя использовать примитивы
• Нельзя
List<int> — только List<Integer>.• Используй обёртки (коллекции могут хранить только объекты, не примитивы).
14. Нельзя создавать массивы с обобщением
•
new T[] не работает.• Используй
List<T> вместо (например, динамические коллекции).15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в
List<? extends Number>.• Используй
<? super Number>, если нужна вставка (например, для пакетной обработки или модификации коллекции).Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥4👍3
Java: Если нужно читать небольшие файлы, можно использовать
#SpringBoot #JavaDev
👉 Java Portal
Files.readAllLines() — это более прямой и простой способ.#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
В Java, если нужно интегрировать полноценного агента, который умеет вызывать инструменты, запускать циклы, хранить контекст и поднимать веб-интерфейс для отладки, не стоит каждый раз собирать это с нуля — здесь уже есть готовый встраиваемый движок.
Встраиваемый движок AI-агента для любого Java-приложения — CLI · REST API · веб Playground
Базовая логика максимально простая: когда модели нужно вызвать инструмент, она выполняет его, записывает результат обратно в контекст и продолжает выполнение. Весь этот цикл упакован в Java-библиотеку и слой приложения на Spring Boot, поэтому его можно напрямую встроить в бизнес-систему или использовать как CLI, REST-сервис или веб Playground.
👉 Java Portal
Встраиваемый движок AI-агента для любого Java-приложения — CLI · REST API · веб Playground
Базовая логика максимально простая: когда модели нужно вызвать инструмент, она выполняет его, записывает результат обратно в контекст и продолжает выполнение. Весь этот цикл упакован в Java-библиотеку и слой приложения на Spring Boot, поэтому его можно напрямую встроить в бизнес-систему или использовать как CLI, REST-сервис или веб Playground.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - fluentlc/claude-code-java: claude-code-java 是一个可嵌入任何 Java 应用的 AI Agent 引擎。claude-code-java is an embeddable AI Agent engine…
claude-code-java 是一个可嵌入任何 Java 应用的 AI Agent 引擎。claude-code-java is an embeddable AI Agent engine for Java applications. - fluentlc/claude-code-java
Spring Boot: избегай
❌ Пометка связи как
#Springboot #РазработкаПО
👉 Java Portal
FetchType.EAGER, если в этом нет реальной необходимости.EAGER заставляет ORM загружать её при каждой загрузке сущности, независимо от того, вызываешь ли ты метод этой связи на самом деле.#Springboot #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Подключения к базе данных — дорогая операция.
Открывать и закрывать их на каждый запрос?
Ещё хуже.
Я нашёл простой разбор того, как на самом деле работает пул соединений и почему это важно.
Ссылка: https://sagarshiroya.dev/posts/database-connection-and-pooling
#Database #SystemDesign
👉 Java Portal
Открывать и закрывать их на каждый запрос?
Ещё хуже.
Я нашёл простой разбор того, как на самом деле работает пул соединений и почему это важно.
Ссылка: https://sagarshiroya.dev/posts/database-connection-and-pooling
#Database #SystemDesign
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Совет по Java: можно избежать чрезмерного количества параметров метода, сгруппировав связанные значения в объекты. #Java #РазработкаПО
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2😁2👀2
Реальная сила Stream Gatherers в Java 24: кастомная stateful-магия с ранним завершением
Java 24 добавляет Stream Gatherers (JEP 485) — серьёзное расширение Stream API.
Они позволяют создавать кастомные промежуточные операции с поддержкой stateful-преобразований, m-to-n отображений, раннего завершения и параллельного выполнения. В отличие от коллекторов (которые терминальные), Gatherers работают прямо внутри конвейера стримов.
Это убирает необходимость в костылях вроде сбора во временные списки или ручных циклов для сложной логики — скользящие окна, накопительные суммы, дедупликация, батчинг.
С Gatherers код на стримах остаётся ленивым, читаемым, композиционным и переиспользуемым. Теперь Stream API выглядит завершённым для реальных сценариев обработки данных.
👉 Java Portal
Java 24 добавляет Stream Gatherers (JEP 485) — серьёзное расширение Stream API.
Они позволяют создавать кастомные промежуточные операции с поддержкой stateful-преобразований, m-to-n отображений, раннего завершения и параллельного выполнения. В отличие от коллекторов (которые терминальные), Gatherers работают прямо внутри конвейера стримов.
Это убирает необходимость в костылях вроде сбора во временные списки или ручных циклов для сложной логики — скользящие окна, накопительные суммы, дедупликация, батчинг.
С Gatherers код на стримах остаётся ленивым, читаемым, композиционным и переиспользуемым. Теперь Stream API выглядит завершённым для реальных сценариев обработки данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
В Java можно использовать
✅ Fail-fast означает, что ошибки фиксируются ближе к месту возникновения, за счёт чего стек вызовов проще читать и анализировать
#Java #РазработкаПО
👉 Java Portal
Optional.orElseThrow() для реализации так называемого fail-fast поведения.#Java #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2
Polling vs Long Polling vs Webhooks vs SSE
Четыре способа получать обновления от сервера. Каждый даёт свой баланс между простотой, эффективностью и «почти реалтайм» доставкой.
Вот как они отличаются:
— Polling
Клиент каждые несколько секунд отправляет запрос: «есть что-то новое?». Сервер отвечает сразу — независимо от наличия данных. Большинство ответов пустые, что тратит ресурсы клиента и сервера. Подходит для сценариев вроде статуса заказа, где допустима задержка и важна простота реализации.
— Long Polling
Клиент отправляет запрос, а сервер держит HTTP-соединение открытым до появления данных или таймаута. Пустых ответов значительно меньше, чем в обычном polling. Использовался, например, в чатах для приближения к реалтайм-доставке сообщений.
— SSE (Server-Sent Events)
Клиент открывает постоянное HTTP-соединение, сервер стримит события по мере появления. Односторонний канал, лёгкий, работает поверх обычного HTTP. Многие AI-интерфейсы стримят ответы токен за токеном именно через SSE.
— Webhooks
Вместо опроса клиентом, сервис сам отправляет HTTP POST на заранее зарегистрированный callback URL при наступлении события. Stripe использует для подтверждения платежей, GitHub — для событий push. Клиент не держит соединение и не делает запросы, просто принимает вызовы.
Часто используется комбинация: polling для простых статусов, SSE для стриминга, webhooks для событий.
👉 Java Portal
Четыре способа получать обновления от сервера. Каждый даёт свой баланс между простотой, эффективностью и «почти реалтайм» доставкой.
Вот как они отличаются:
— Polling
Клиент каждые несколько секунд отправляет запрос: «есть что-то новое?». Сервер отвечает сразу — независимо от наличия данных. Большинство ответов пустые, что тратит ресурсы клиента и сервера. Подходит для сценариев вроде статуса заказа, где допустима задержка и важна простота реализации.
— Long Polling
Клиент отправляет запрос, а сервер держит HTTP-соединение открытым до появления данных или таймаута. Пустых ответов значительно меньше, чем в обычном polling. Использовался, например, в чатах для приближения к реалтайм-доставке сообщений.
— SSE (Server-Sent Events)
Клиент открывает постоянное HTTP-соединение, сервер стримит события по мере появления. Односторонний канал, лёгкий, работает поверх обычного HTTP. Многие AI-интерфейсы стримят ответы токен за токеном именно через SSE.
— Webhooks
Вместо опроса клиентом, сервис сам отправляет HTTP POST на заранее зарегистрированный callback URL при наступлении события. Stripe использует для подтверждения платежей, GitHub — для событий push. Клиент не держит соединение и не делает запросы, просто принимает вызовы.
Часто используется комбинация: polling для простых статусов, SSE для стриминга, webhooks для событий.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Аккуратная идея из превью JDK 24: JEP 487, Scoped Values.
Scoped Values направлены на то, чтобы сделать общий неизменяемый контекст более предсказуемым по сравнению с ThreadLocal, особенно в современном конкурентном коде.
Небольшой пример👇
Scoped Values направлены на то, чтобы сделать общий неизменяемый контекст более предсказуемым по сравнению с ThreadLocal, особенно в современном конкурентном коде.
Небольшой пример
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java:
Если нужно посчитать, сколько раз элемент встречается в списке, нет необходимости писать цикл вручную.
Используй готовый метод:
Пример:
👉 Java Portal
Если нужно посчитать, сколько раз элемент встречается в списке, нет необходимости писать цикл вручную.
Используй готовый метод:
Collections.frequency(...)Пример:
int count = Collections.frequency(
List.of("red", "green", "red"),
"red"
);
System.out.println(count); // 2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥1
А что у нас здесь? Новая серия вебинаров по Java!
И первый вебинар от PVS-Studio посвящен современному Gradle для Java-разработчика.
Вы узнаете, зачем в современных проектах нужны модули и как они помогают масштабировать кодовую базу без хаоса. Поймете, как устроен жизненный цикл Gradle и какие механизмы стоят за его скоростью и гибкостью.
А еще:
- в формате лайвкодинга создадите с нуля базовую структуру мультимодульного проекта;
- настроите зависимости между модулями;
- обсудите лучшие практики организации кода;
- после вебинара получите понятную основу для построения поддерживаемых и расширяемых Java-проектов любой сложности.
Подробности и регистрация по ССЫЛКЕ.
И первый вебинар от PVS-Studio посвящен современному Gradle для Java-разработчика.
Вы узнаете, зачем в современных проектах нужны модули и как они помогают масштабировать кодовую базу без хаоса. Поймете, как устроен жизненный цикл Gradle и какие механизмы стоят за его скоростью и гибкостью.
А еще:
- в формате лайвкодинга создадите с нуля базовую структуру мультимодульного проекта;
- настроите зависимости между модулями;
- обсудите лучшие практики организации кода;
- после вебинара получите понятную основу для построения поддерживаемых и расширяемых Java-проектов любой сложности.
Подробности и регистрация по ССЫЛКЕ.
Java: если нужно писать переносы строк, соответствующие ОС, используй
👉 Java Portal
System.lineSeparator().Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
@ComponentScan аккуратно, чтобы не сканировать целые пакеты по ошибке.Предположим, вы используете что-то вроде
@ComponentScan("com.mycompany"):Лучшие практики:
@SpringBootApplication
public class MyApplication { }
По умолчанию сканируются только подпакеты пакета, где находится MyApplication
@ComponentScan({
"com.mycompany.myapp.product",
"com.mycompany.myapp.order"
})Please open Telegram to view this post
VIEW IN TELEGRAM
❤4