Java Portal | Программирование
12.3K subscribers
1.34K photos
108 videos
42 files
1.35K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Java-Инженеры, наблюдающие, как все остальные вайбкодят приложения

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣30🔥3🏆3
Совет по Java Spring Boot

Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
UnrecognizedPropertyException.

Чтобы этого избежать и не ломать API, добавь аннотацию:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}


👉 Java Portal
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 через комментарии /// в небольшой библиотеке на Maven + JUnit, включая документацию пакетов, записи, запечатанные типы, генерацию JavaDoc и всплывающие подсказки в IDE.

http://buff.ly/RmaVWSt

#Java #Java24 #Javadoc #Maven

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
This media is not supported in your browser
VIEW IN TELEGRAM
Вы предпочитаете аккуратно отформатированные текстовые блоки для аннотаций запросов при использовании Spring Data?

https://spring.io/tools теперь умеет генерировать именно такие при преобразовании AOT-метаданных репозитория в аннотации запросов

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Java Generics — всё, что нужно знать

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>, если нужна вставка (например, для пакетной обработки или модификации коллекции).

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥4👍3
Java: Если нужно читать небольшие файлы, можно использовать Files.readAllLines() — это более прямой и простой способ.
#SpringBoot #JavaDev

👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: избегай FetchType.EAGER, если в этом нет реальной необходимости.

Пометка связи как EAGER заставляет ORM загружать её при каждой загрузке сущности, независимо от того, вызываешь ли ты метод этой связи на самом деле.
#Springboot #РазработкаПО

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Подключения к базе данных — дорогая операция.
Открывать и закрывать их на каждый запрос?
Ещё хуже.

Я нашёл простой разбор того, как на самом деле работает пул соединений и почему это важно.

Ссылка: https://sagarshiroya.dev/posts/database-connection-and-pooling

#Database #SystemDesign

👉 Java Portal
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
👍72😁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
Please open Telegram to view this post
VIEW IN TELEGRAM
3
В Java можно использовать Optional.orElseThrow() для реализации так называемого fail-fast поведения.

Fail-fast означает, что ошибки фиксируются ближе к месту возникновения, за счёт чего стек вызовов проще читать и анализировать
#Java #РазработкаПО

👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3
Аккуратная идея из превью JDK 24: JEP 487, Scoped Values.

Scoped Values направлены на то, чтобы сделать общий неизменяемый контекст более предсказуемым по сравнению с ThreadLocal, особенно в современном конкурентном коде.

Небольшой пример 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java:

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

Используй готовый метод:
Collections.frequency(...)

Пример:

int count = Collections.frequency(
List.of("red", "green", "red"),
"red"
);
System.out.println(count); // 2


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥1
А что у нас здесь? Новая серия вебинаров по Java!

И первый вебинар от PVS-Studio посвящен современному Gradle для Java-разработчика.

Вы узнаете, зачем в современных проектах нужны модули и как они помогают масштабировать кодовую базу без хаоса. Поймете, как устроен жизненный цикл Gradle и какие механизмы стоят за его скоростью и гибкостью.

А еще:
- в формате лайвкодинга создадите с нуля базовую структуру мультимодульного проекта;

- настроите зависимости между модулями;

- обсудите лучшие практики организации кода;

- после вебинара получите понятную основу для построения поддерживаемых и расширяемых Java-проектов любой сложности.

Подробности и регистрация по ССЫЛКЕ.
Микросервисы — это хаос без этих паттернов

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Java: если нужно писать переносы строк, соответствующие ОС, используй System.lineSeparator().


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
💡Spring Boot: задавайте границы @ComponentScan аккуратно, чтобы не сканировать целые пакеты по ошибке.

Предположим, вы используете что-то вроде @ComponentScan("com.mycompany"):

Увеличивается время сканирования classpath
Замедляется запуск приложения
Могут подгружаться классы, не предназначенные быть Spring-компонентами

Лучшие практики:

Полагаться на значения по умолчанию:

@SpringBootApplication
public class MyApplication { }


По умолчанию сканируются только подпакеты пакета, где находится MyApplication

Сканировать конкретные подпакеты:

@ComponentScan({
"com.mycompany.myapp.product",
"com.mycompany.myapp.order"
})


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