java_iibrary | Unsorted

Telegram-канал java_iibrary - Java Portal | Программирование

12073

Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg

Subscribe to a channel

Java Portal | Программирование

Эволюция Java: от Java 8 до Java 27

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

Ключевые обновления по версиям:

• Java 8 (2014) — лямбда-выражения, Stream API, функциональные интерфейсы и новый API для работы с датой и временем.
• Java 11 (2018, LTS) — стандартный HTTP Client, var в параметрах лямбда-выражений и запуск однофайловых программ без предварительной компиляции.
• Java 17 (2021, LTS) — sealed-классы, pattern matching для instanceof и усиленная инкапсуляция внутренних API JDK.
• Java 21 (2023, LTS) — виртуальные потоки, record patterns, pattern matching для switch и sequenced collections.
• Java 24 (2025) — улучшения виртуальных потоков: JEP 491 позволяет синхронизированным виртуальным потокам не блокировать carrier threads.
• Java 25 (2025, LTS) — новая LTS-версия с улучшениями производительности, безопасности и стабильности.
• Java 27 (2026) — очередной этап развития платформы: новые возможности и улучшения производительности, многопоточности и удобства разработки.

Что важно разработчикам? Java давно перестала быть просто языком для корпоративных приложений. Виртуальные потоки упрощают работу с большим количеством параллельных задач, Stream API помогает обрабатывать коллекции, а современные версии языка делают код выразительнее.

Если вы используете Java в работе, стоит следить за новыми версиями — особенно за LTS-релизами, которые получают длительную поддержку.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Совет для Java-разработчиков: осторожнее со сложными регулярными выражениями

Будьте внимательны при использовании сложных регулярных выражений для проверки пользовательского ввода.

Некоторые шаблоны могут вызывать катастрофический возврат (Catastrophic Backtracking) — ситуацию, когда движок регулярных выражений перебирает огромное количество вариантов сопоставления.

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

90% Java-разработчиков не заметят ошибку в этом коде.

Сможете найти баг, не запуская программу?

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Перестань так использовать Optional в Java

Вместо того чтобы проверять наличие значения через isPresent() и извлекать его с помощью get():

Optional<User> user = repo.findById(id);

if (user.isPresent()) {
return user.get();
}


Используй orElseThrow():
return repo.findById(id)
.orElseThrow(() -> new NotFoundException(id));


Так код становится короче, чище и понятнее.

Помни: Optional — это тип возвращаемого значения, а не просто навороченная проверка на null.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java-баг, который легко пропустить: HashSet больше не находит объект

Ты добавляешь собственный объект в HashSet, а затем изменяешь одно из его полей. После этого set.contains(object) возвращает false, хотя объект всё ещё находится внутри коллекции.

Как такое возможно?

Предположим, что методы hashCode() и equals() зависят от email пользователя.

Сначала добавляем объект в коллекцию:

user.email = "old@example.com";
set.add(user);


Затем меняем email:
user.email = "new@example.com";


Если после изменения поля изменился и hashCode(), объект останется в той корзине (bucket), куда его поместили при добавлении. Но при поиске HashSet может обратиться уже к другой корзине — и не найти объект.

Главное правило: не изменяй поля, участвующие в equals() и hashCode(), пока объект находится в хеш-коллекции.
Иначе объект может физически оставаться в коллекции, но стать практически недоступным для поиска.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java Tip: используйте Optional, чтобы избежать лишних проверок на null

Optional<String> name = Optional.ofNullable(getName());
name.ifPresent(System.out::println);


Optional
позволяет явно обозначить, что значение может отсутствовать, и безопасно обработать этот случай.

✅ Безопаснее работа с null
✅ Код понятнее и намерения разработчика очевиднее
✅ Меньше риска получить NullPointerException

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥

✅ 29 октября, четверг, 19:00 (мск) — приходите на митап в Санкт-Петербурге или смотрите трансляцию. 

Спикеры из ЮMoney и Сбера выступят с докладами:

🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.

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

🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.

Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈

Читать полностью…

Java Portal | Программирование

Инструмент недели: Kubetail

Разбирать логи в Kubernetes бывает непросто: приходится переключаться между подами, запускать kubectl logs и искать причину ошибки среди множества реплик приложения.

Kubetail open-source инструмент для просмотра логов Kubernetes в реальном времени. Он собирает логи из нескольких подов в одном интерфейсе, упрощая отладку приложений.

Что умеет:

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

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

GitHub: https://github.com/kubetail-org/kubetail

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Большая коллекция из практических рекомендаций по защите приложений. Внутри: SQL Injection, XSS, JWT, OAuth2, Kubernetes, Docker, API Security, а теперь ещё и безопасность агентов MCP и RAG.

https://cheatsheetseries.owasp.org

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 @NonNull и @Nullable помогают IDE находить ошибки.

✅ Указывают, какие значения могут быть null.
✅ Инструменты предупреждают о возможных NullPointerException (NPE) прямо во время написания кода.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Большинство разработчиков изучают Spring Boot, создавая CRUD API. Но для работы с backend в production этого далеко не достаточно.

В шпаргалке по Spring Boot, в которой собраны ключевые концепции, которые должен знать каждый backend-разработчик.

Что внутри:

• Архитектура Spring Boot
• Жизненный цикл HTTP-запроса
• Структура проекта
• Основные аннотации
• Подходы к построению REST API
• JPA и слой Repository
• Валидация данных
• Обработка исключений
• JWT и Spring Security
• HTTP-статусы
• Команды Docker
• Лучшие практики для production

Главная ошибка начинающих. Они сосредотачиваются только на связке: Controller → Service → Repository

Но упускают из виду:

• Валидацию данных
• Безопасность
• Логирование
• Транзакции
• Мониторинг
• Обработку ошибок
• Масштабируемость

Именно здесь начинается настоящая backend-разработка.

Важный момент о производительности в production. Большинство проблем с производительностью вызваны не самим Spring Boot. Чаще всего узкие места находятся в других компонентах системы:

• Медленные запросы к базе данных
• Отсутствие необходимых индексов
• Исчерпание пула соединений
• Сериализация больших объёмов данных
• Блокирующие внешние API
• Проблемы N+1 при выполнении запросов к базе данных

В каком порядке изучать Spring Boot.

Начальный уровень:

• REST API
• Контроллеры
• Внедрение зависимостей
• CRUD API
• Основы JPA

Средний уровень:
• Валидация
• Обработка исключений
• JWT и безопасность
• Транзакции
• Docker

Продвинутый уровень:
• Kafka
• Redis
• Микросервисы
• Распределённая трассировка (Distributed Tracing)
• Kubernetes
• Событийно-ориентированная архитектура (Event-Driven Architecture)

Мой любимый раздел — жизненный цикл запроса. Когда понимаешь, как запрос проходит через приложение, отлаживать ошибки становится гораздо проще:

Клиент
↓
Tomcat
↓
DispatcherServlet
↓
Controller
↓
Service
↓
Repository
↓
База данных


Совет от опытных инженеров
. Не ограничивайся изучением синтаксиса. Разбирайся в том:

• Почему системы выходят из строя.
• Где возникают узкие места производительности.
• Как работает масштабирование.
• Как искать и устранять проблемы в production.

Именно это отличает разработчиков, которые просто повторяют примеры из обучающих материалов, от настоящих backend-инженеров.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Spring Boot + Kafka: отправка и получение событий с минимумом кода

✅ Внедрите KafkaTemplate, чтобы отправлять сообщения в топик.
✅ Добавьте @KafkaListener к методу, чтобы обрабатывать входящие сообщения.
✅ Автоконфигурация Spring Boot настроит компоненты Kafka по параметрам spring.kafka.*.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 @ConditionalOnClass: конфигурация включается, если нужный класс есть в classpath

✅ Используется в автоконфигурациях Spring Boot, например для Kafka и Redis.
✅ Если класса нет, условная конфигурация пропускается.
✅ В паре с @ConditionalOnMissingBean позволяет предоставить бин по умолчанию, который приложение может заменить собственным.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Ленивая инициализация в Spring Boot

Настройка spring.main.lazy-initialization=true откладывает создание большинства бинов до момента, когда они понадобятся.

✅ Вместе с созданием бина откладывается и вызов @PostConstruct.
✅ Приложение запускается быстрее, но прогрев кэша или проверки схемы БД могут не выполниться, если соответствующий бин никто не запросит.
✅ Ошибки инициализации могут проявиться уже при первом запросе.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java Records — больше, чем сокращённая запись класса

record User(String name, String email) {}


Вы получаете:

→ Поля компонентов с модификатором final.
→ Автоматические equals(), hashCode() и toString().
→ Явный сигнал: «этот тип хранит данные».

Используйте records для DTO — меньше шаблонного кода, проще ревью.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

18 практических работ по DevOps

Docker, Kubernetes, CI/CD, Terraform, Ansible, Helm, GitOps, мониторинг через Prometheus и Grafana, а также управление секретами и progressive delivery. Курс рассчитан на 16 недель.

В финале у вас будет не просто набор выполненных заданий, а собственный кластер с автоматизированным развёртыванием и мониторингом.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java Roadmap: от новичка до профессионального разработчика

Основы Java (Java Fundamentals). Начните с базовых элементов языка:

• Синтаксис и структура программы
• Переменные, типы данных и операторы
• Управляющие конструкции: if/else, циклы, switch
• Функции и методы
• Массивы и строки

Объектно-ориентированное программирование (ООП). Java построена на принципах ООП — важно хорошо разобраться в них:

• Классы и объекты
• Инкапсуляция, наследование, полиморфизм и абстракция
• Интерфейсы и абстрактные классы
• Конструкторы и перегрузка методов
• Модификаторы доступа

Java Collections. Научитесь эффективно работать со структурами данных:

• Интерфейсы List, Set, Map
• ArrayList, LinkedList
• HashMap, TreeMap
• HashSet, TreeSet
• Итераторы и компараторы

Обработка исключений (Exception Handling).Научитесь создавать надёжные и отказоустойчивые приложения:

• try-catch-finally
• Checked и unchecked exceptions
• Пользовательские исключения
• Лучшие практики обработки ошибок

Работа с файлами и сериализация (File I/O & Serialization). Освойте хранение и передачу данных:

• Чтение и запись файлов
• Буферизированные потоки
• Сериализация объектов
• NIO (New I/O)

Многопоточность и параллелизм (Multithreading &
Concurrency)
. Научитесь создавать производительные приложения:

• Потоки и Runnable
• Синхронизация и блокировки
• Executor и пулы потоков
• CompletableFuture
• Потокобезопасные коллекции

Функциональное программирование в Java. Изучите возможности современной Java:

• Лямбда-выражения
• Stream API
• Функциональные интерфейсы
• Класс Optional
• Ссылки на методы

Java-фреймворки. Научитесь быстрее создавать масштабируемые приложения:

• Spring Framework
• Spring Boot
• Spring MVC
• Hibernate / JPA
• Micronaut / Quarkus

Базы данных и хранение данных (Databases & Persistence). Разберитесь, как приложения работают с данными:

• JDBC
• SQL (MySQL, PostgreSQL)
• ORM (Hibernate)
• Транзакции и пулы соединений

Сборка проектов и управление зависимостями (Build Tools). Освойте инструменты для сборки и управления проектами:

• Maven
• Gradle
• Структура проекта
• Управление зависимостями

Тестирование (Testing). Научитесь обеспечивать качество и надёжность кода:

• JUnit
• Mockito
• Интеграционное тестирование
• Разработка через тестирование (TDD)

DevOps и развёртывание (DevOps & Deployment). Подготовьте Java-приложения к запуску в production:

• Docker и контейнеризация
• CI/CD-пайплайны
• Развёртывание в облаке (AWS, Azure)
• Мониторинг и логирование

Проектирование систем на Java (System Design). Научитесь проектировать масштабируемые backend-системы:

• REST API и микросервисы
• Кэширование (Redis)
• Очереди сообщений (Kafka, RabbitMQ)
• Балансировка нагрузки и масштабирование

Практические проекты (Real-World Projects). Закрепите знания на реальных задачах:

• REST API на Spring Boot
• Backend для интернет-магазина
• Система аутентификации с JWT
• Проект на основе микросервисной архитектуры
• Банковская или платёжная система

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Spring Boot: пагинация с помощью Pageable и Page<T>

В Spring Boot можно легко реализовать постраничную загрузку данных с помощью Pageable и Page<T>.

✅ Spring автоматически преобразует параметры ?page=0&size=20 в объект Pageable.
✅ Page<T> содержит не только список полученных записей (content), но и общее количество записей (total count).

Это позволяет удобно реализовать пагинацию на стороне API и передавать интерфейсу всё необходимое для отображения страниц.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Java Tip: Создаём компактный LRU-кэш без сторонних библиотек

Для реализации простого LRU-кэша в Java можно использовать встроенный LinkedHashMap.

✅ accessOrder = true — перемещает элемент в конец при каждом обращении через get(), поддерживая порядок использования.
✅ Переопределите removeEldestEntry() — чтобы автоматически удалять самый давно неиспользуемый элемент, когда кэш достигает заданного размера.

LRU (Least Recently Used) — алгоритм, который удаляет элемент, к которому дольше всего не обращались.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Spring Boot Tip: генерируйте Swagger-документацию автоматически с помощью springdoc-openapi

Добавьте springdoc-openapi в проект, и библиотека автоматически создаст документацию API на основе ваших контроллеров.

✅ Подключите starter-зависимость — библиотека сама просканирует эндпоинты.
✅ Откройте /swagger-ui.html, чтобы получить интерактивный интерфейс для тестирования API.
✅ Экспортируйте спецификацию OpenAPI в JSON или YAML для клиентов и API-шлюзов.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

В Java Generics не работают с примитивными типами

Обобщения (Generics) в Java работают с ссылочными типами, но не с примитивами.

List<Integer> nums = new ArrayList<>(); // ✅
List<int> nums = new ArrayList<>(); // ❌


Дело в том, что Java реализует Generics через type erasure (стирание типов), а int, double и boolean — примитивные типы, а не ссылочные.

Поэтому Java использует классы-обёртки:

int → Integer
double → Double
boolean → Boolean

Автоупаковка (autoboxing) позволяет работать с ними почти так же, как с примитивами:

List<Integer> nums = List.of(1, 2, 3);


Java автоматически преобразует значения int в объекты Integer.

Главное: Generics работают с объектами, а примитивы в Java объектами не являются.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Размещай бизнес-логику в сервисе с @Transactional, а не в контроллере.

✅ Один метод сервиса может безопасно вызывать несколько репозиториев в рамках одной транзакции.
✅ Все операции с БД фиксируются вместе при успехе или вместе отменяются при ошибке.
✅ Контроллеры остаются простыми: проверяют входные данные и вызывают нужный сервис.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Не создавай новый Thread() для каждой задачи — используй пул потоков.

✅ Создание потоков требует ресурсов, а пул позволяет повторно использовать уже созданные потоки.
✅ Executor ограничивает количество задач, выполняемых одновременно.
✅ Когда работа завершена, не забудь вызвать shutdown(), чтобы корректно завершить работу пула.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Gemini Pro Argon на 1.5 года по цене кофе?

Gemini Pro на 18 месяцев можно купить за 6$ (480₽ вместо 30.000₽) - последние 2 дня акции от Jio!

> 4.0 Argon топ для вайбкодеров
> Nano Banana 2 PRO (картинки)
> Видео генерация (видео, нарезки, мувики)
> 5 ТБ облака в Google One

🔓Вот бесплатный VPN для работы Gemini и AI

Работает акция еще 2 дня по такой цене, дальше будет официальная цена $360 за 18 месяцев


Приобрести можно в Магазине с 20.000+ покупок и 2000+ отзывов (есть возвраты и замены).

Читать полностью…

Java Portal | Программирование

Большинство воспринимает Spring Boot просто как фреймворк для создания REST API.

Но за ним скрывается гораздо более крупная экосистема 👇

• Spring Core и внедрение зависимостей
• Spring MVC и WebFlux
• JPA, Hibernate и базы данных
• Безопасность с JWT и OAuth 2.0
• Kafka и RabbitMQ
• Redis и распределённое кэширование
• Docker, Kubernetes и облачные платформы
• Мониторинг с Actuator, Prometheus и Grafana

Spring Boot упрощает настройку проекта, а понимание всех стоящих за ним уровней помогает стать сильнее как бэкенд-разработчик.

Фреймворк позволяет быстро начать работу.

Экосистема помогает создавать приложения для продакшена.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

👍

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Утечка памяти, фрагментация и нагрузка на GC: в чём разница?

Приложение потребляет много памяти — это ещё не означает утечку. Причины могут быть разными.

Memory Leak — ненужные объекты остаются достижимыми. Программа больше не использует их, но продолжает хранить ссылки, поэтому сборщик мусора не может освободить память.

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

Memory Fragmentation — свободная память есть, но она разбита на неудобные участки. Например, суммарно места достаточно, но нет подходящего непрерывного блока для выделения.

В Java влияние фрагментации зависит от сборщика мусора и области памяти: heap, native или off-heap. Многие сборщики перемещают объекты и уплотняют память, но это не устраняет все возможные случаи.

GC Pressure — объекты создаются быстрее, чем системе удобно их убирать. Память освобождается, однако GC приходится работать часто или интенсивно, расходуя CPU и увеличивая задержки.

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

При диагностике смотрите на разные сигналы:

• Утечка: какие объекты остаются живыми и что удерживает ссылки на них.
• Фрагментация: в какой области памяти не удаётся выделить нужный блок.
• GC Pressure: скорость аллокаций, частоту сборок, паузы и затраты CPU.

Увеличение -Xmx иногда помогает, но при утечке лишь откладывает проблему. Сначала выясните, почему память растёт и на что тратится время GC.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Что происходит между GET /users/123 и ответом API?

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

В статье разобран путь запроса в приложении на Spring Boot:

• DNS и TLS.
• Балансировка нагрузки.
• Spring Security и JWT.
• Попадание и промах кэша Redis.
• Ожидание соединения из пула.
• Запросы к PostgreSQL.
• Взаимодействие с Kafka.
• Источники задержек на каждом этапе.

Не каждый запрос проходит все эти шаги: соединение может переиспользоваться, кэш — исключить обращение к БД, а Kafka участвует только там, где это предусмотрено логикой приложения.

vishipatil/what-actually-happens-when-you-call-a-rest-api-12a0f6d3fbc8">Читать на Medium

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Java: используйте Path и Files для работы с файлами

✅ Path.of(...) создаёт путь с учётом файловой системы текущей ОС.
✅ Files.readString(), writeString() и readAllLines() позволяют читать и записывать текст одной строкой.
✅ Для простых операций нужно меньше шаблонного кода, чем с FileReader и BufferedReader.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java Records, Lombok и POJO: в чём разница?

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

• Record — компактный носитель данных. Records стали стандартной возможностью языка в Java 16:

public record User(
Long id,
String name,
String email
) {}


Компилятор создаёт конструктор для всех компонентов, методы доступа id(), name(), email(), а также equals(), hashCode() и toString(). Подходит для DTO, моделей запросов и ответов API, данных событий.

Неизменяемость поверхностная: поля компонентов — final, но содержимое переданного списка или другого изменяемого объекта всё ещё может меняться.

• Lombok — меньше шаблонного кода. Аннотации позволяют генерировать методы и конструкторы при компиляции:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private String email;
}


Lombok умеет создавать getters/setters, конструкторы, equals(), hashCode(), toString() и builder через @Builder.

Удобен для существующих проектов и классов с большим количеством повторяющегося кода. При этом добавляет зависимость при сборке и требует понимания того, что именно генерируется.

С JPA-сущностями аннотации стоит выбирать аккуратно: автоматически созданные equals(), hashCode() и toString() могут некорректно работать со связями и ленивой загрузкой.

• POJO — обычный Java-объект. Класс без обязательной привязки к специальному фреймворку или модели программирования. Вы сами определяете конструкторы, валидацию, изменяемость, бизнес-логику и правила сравнения. Подходит для доменных моделей и классов с нестандартным поведением.

Это не три взаимоисключающих варианта: record — возможность языка, Lombok — инструмент генерации кода, POJO — характеристика класса. Класс с аннотациями Lombok вполне может оставаться POJO. Выбирайте подход по назначению класса, а не только по количеству сэкономленных строк.

👉 Java Portal

Читать полностью…
Subscribe to a channel