Знаете, как в Java обычно обновить одно поле в неизменяемом объекте? Нужно создавать копию с нужным значением. Муторно. Lombok умеет делать это элегантно.
🔹 Что делает @With
Генерирует методы withX(...), которые создают копию объекта с изменённым полем. Подходит для immutable-моделей и паттерна builder. Класс при этом должен быть final (например, через @Value или вручную).
🔹 Пример
@Value
@With
public class User {
String name;
int age;
}
Теперь можно:
User user1 = new User("Alice", 25);
User user2 = user1.withAge(30); // создаётся новый объект с новым age
Объекты остаются неизменяемыми, но при этом легко "обновляемыми".
🔹 Зачем это нужно
— Удобно при работе с immutable-классами.
— Простой способ "копировать с изменением".
— Чистый, декларативный стиль без boilerplate.
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 HTTP/2: эволюция веб-протокола
Если вы работаете с REST API, микросервисами или веб-приложениями на Spring Boot, понимание HTTP/2 — не просто полезно, а необходимо.
В отличие от HTTP/1.1, где каждое TCP-соединение обрабатывает только один запрос одновременно, HTTP/2 позволяет осуществлять параллельную передачу нескольких запросов и ответов по одному соединению.
Это означает:
— Экономия ресурсов сервера и клиента.
— Одновременная передача нескольких потоков данных.
— Уменьшение объема передаваемой информации.
🔗 Подробнее в статье
🐸 Библиотека джависта #буст
Если вы работаете с REST API, микросервисами или веб-приложениями на Spring Boot, понимание HTTP/2 — не просто полезно, а необходимо.
В отличие от HTTP/1.1, где каждое TCP-соединение обрабатывает только один запрос одновременно, HTTP/2 позволяет осуществлять параллельную передачу нескольких запросов и ответов по одному соединению.
Это означает:
— Экономия ресурсов сервера и клиента.
— Одновременная передача нескольких потоков данных.
— Уменьшение объема передаваемой информации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 Как избавиться от Flaky-тестов с помощью JMina
Рассматривается использование библиотеки JMina для стабилизации нестабильных тестов. Автор делится практиками выявления и устранения причин нестабильности, улучшая надежность тестового покрытия.
🔹 Как ZGC аллоцирует память в хипе
Анализируется поведение сборщика мусора ZGC при выделении памяти. Обсуждаются особенности работы ZGC, его преимущества и потенциальные подводные камни при использовании в различных сценариях.
🔹 Паттерны и методологии разработки
Подборка материалов, посвященных современным паттернам проектирования и методологиям разработки. Рассматриваются лучшие практики, помогающие создавать устойчивые и масштабируемые приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека задач по Java | тесты, код, задания
Какой признак характерен для архитектуры CQRS?
Anonymous Quiz
75%
Разделение команд (изменений) и запросов (чтения)
10%
Использование одного сервиса для чтения и записи
4%
Обязательное хранение в SQL
6%
Отказ от асинхронных коммуникаций
5%
Хранение бизнес-логики на клиенте
Разработчик бэкенда (BDUI-платформа) — 220 000 — 480 000 ₽ — гибрид (Москва)
Java-разработчик — от 100 000 до 200 000 ₽ — удалёнка
Java Developer — от 300 000 ₽ — удалёнка
Senior Java Developer — от 4 500 до 6 000 € — гибрид (Москва)
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблема: При большом количестве одновременных запросов блокирующая модель ввода-вывода приводит к исчерпанию потоков и задержкам в обработке, что негативно сказывается на отклике приложения и пользовательском опыте.
Решение: в книге Mastering Spring Boot 3.0 автор предлагает использовать Spring WebFlux — реактивный стек Spring, основанный на неблокирующей модели ввода-вывода. Это позволяет обрабатывать тысячи одновременных запросов с минимальными затратами ресурсов, обеспечивая высокую отзывчивость и масштабируемость приложения.
Пример реализации реактивного REST-контроллера с использованием Spring WebFlux:
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public Flux<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public Mono<ResponseEntity<User>> getUserById(@PathVariable String id) {
return userService.getUserById(id)
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping
public Mono<User> createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
В этом примере используются типы Flux и Mono из Project Reactor для представления потоков данных и одиночных значений соответственно. Это позволяет обрабатывать запросы и ответы асинхронно и неблокирующим образом.
Преимущества:
— Неблокирующая модель ввода-вывода позволяет эффективно использовать ресурсы при высоких нагрузках.
— Асинхронная обработка запросов обеспечивает быстрый отклик даже при большом количестве одновременных пользователей.
— Интеграция с другими реактивными библиотеками и потоками данных упрощает построение сложных бизнес-процессов.
Еще больше полезных книг — в нашем канале @progbook
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Есть бизнес-логика, которая требует многозадачности, но нужно сделать это грамотно и без лишних усилий? ИИ поможет сэкономить время на сложных аспектах работы с потоками и синхронизацией.
📝 Промпт:
Generate a Spring Boot service that processes [описание бизнес-логики] with multithreading support. Use Java concurrency features like ExecutorService, CompletableFuture, or @Async. Ensure thread safety, synchronization, and efficient thread pool management. Explain design decisions and trade-offs.
— Используйте
Java 17+ features
, чтобы сразу писать асинхронный и многозадачный код на современном уровне— Добавьте
Add thread pool management
, чтобы контролировать нагрузку и избежать перегрузок— Добавьте
Add exception handling for multithreading
, чтобы предотвратить ошибки в параллельных операцияхPlease open Telegram to view this post
VIEW IN TELEGRAM
🛠 20 нюансов PostgreSQL
PostgreSQL давно перестал быть просто популярной СУБД — сегодня это мощный, гибкий и инновационный инструмент, способный решать самые сложные задачи в масштабируемых приложениях.
Если вы серьезно занимаетесь бэкендом и хотите держать руку на пульсе самых важных особенностей и тонкостей PostgreSQL, то игнорировать эти нюансы нельзя:
— как правильно оптимизировать запросы и работу с индексами,
— тонкости работы с транзакциями и параллелизмом,
— новые возможности JSON и работы с данными,
— расширенные методы мониторинга и отладки,
— и многое другое, что реально сэкономит время и ресурсы вашего проекта.
🔗 Подробнее в статье
🐸 Библиотека джависта #буст
PostgreSQL давно перестал быть просто популярной СУБД — сегодня это мощный, гибкий и инновационный инструмент, способный решать самые сложные задачи в масштабируемых приложениях.
Если вы серьезно занимаетесь бэкендом и хотите держать руку на пульсе самых важных особенностей и тонкостей PostgreSQL, то игнорировать эти нюансы нельзя:
— как правильно оптимизировать запросы и работу с индексами,
— тонкости работы с транзакциями и параллелизмом,
— новые возможности JSON и работы с данными,
— расширенные методы мониторинга и отладки,
— и многое другое, что реально сэкономит время и ресурсы вашего проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
Коллекции — база для любой бизнес-логики, но неправильный выбор структуры данных или операций приводит к тормозам и ошибкам.
🔹 Выбор структуры данных
— ArrayList быстрый доступ по индексу, но медленная вставка/удаление в середине.
— LinkedList эффективен для частых вставок и удалений, но медленный случайный доступ.
— HashSet быстрая проверка наличия элемента, но не гарантирует порядок.
— LinkedHashSet сохраняет порядок вставки, но чуть медленнее.
— TreeSet упорядоченный набор, но операции дороже из-за балансировки дерева.
🔹 Оптимизация операций
— Избегайте частых автокорректировок размера у ArrayList. Инициализируйте вместимость сразу, если размер известен.
— При массовой вставке используйте addAll() вместо последовательного add().
— Для поиска и фильтрации предпочитайте потоки (Stream API).
🔹 Коллекции и многопоточность
— Для многопоточных сценариев используйте ConcurrentHashMap или CopyOnWriteArrayList.
— Помните, что Collections.synchronizedXXX() — это обертки с блокировкой, часто неэффективные для интенсивных операций.
🔹 Память и производительность
— Помните о влиянии неизменяемых коллекций: они безопасны, но могут создавать накладные расходы по памяти.
— Профилируйте приложения, чтобы определить реальные узкие места в работе с коллекциями.
🔹 Дополнительно
— Используйте Collectors.toMap() и другие мощные инструменты Stream API для удобного преобразования и агрегации данных.
— В новых версиях Java появляются оптимизации и новые структуры (например, Immutable Collections в Java 9+).
Please open Telegram to view this post
VIEW IN TELEGRAM
🚨 Смешные новости про IT теперь в одном канале
Мы запустили @hahacker_news — наш новый юмористический IT-канал.
Туда будем постить лучшие шутки до 19го мая, которые вы присылали на конкурс.
👉 @hahacker_news — голосование уже идёт, переходите, читайте, угарайте и оставляйте реакции
Мы запустили @hahacker_news — наш новый юмористический IT-канал.
Туда будем постить лучшие шутки до 19го мая, которые вы присылали на конкурс.
👉 @hahacker_news — голосование уже идёт, переходите, читайте, угарайте и оставляйте реакции
Please open Telegram to view this post
VIEW IN TELEGRAM
🎧 Что послушать — #подкаст
🔹 Javaswag #75
Дата выпуска: 4 февраля 2025
Ведущий: Дмитрий Волыхин
Гость: Илья Ильиных
Продолжительность: 2 часа 24 минуты
В этом выпуске подкаста Javaswag обсуждаются причины перехода с Java на Go, преимущества Go по сравнению с Java, а также использование редактора Vim для повышения эффективности разработки.
🔹 Ключевые темы выпуска
00:00 — Переход от Java к Go
06:13 — Проблемы с Optional и его использование
11:20 — Использование Optional в Java
18:30 — Важность форматирования кода
23:42 — Проблемы и решения в команде
31:05 — Переход на Vim и его связь с GoLang
36:30 — Проблемы с Gradle и тестами
44:51 — Проекты и архитектура микросервисов
51:03 — Сравнение Go и Java
56:13 — Погружение в Go и его особенности
01:10:36 — Мутационное тестирование и его важность
01:16:09 — Сравнение тестирования в Java и Go
01:24:44 — Принципы написания устойчивых тестов
01:31:32 — Тестирование как черный ящик
01:37:13 — Интерфейсы в Go и Java
01:43:09 — Обработка ошибок в Go и Java
01:48:18 — Теория монады и её применение в Java
01:53:35 — Проблемы написания больших проектов на Go
02:04:50 — Итераторы в Go и Lua
02:13:26 — Эффективные методы работы с кодом
02:19:12 — Непопулярные мнения о потоках в Java и Kotlin
02:24:34 — Проблемы и решения в Java и Kotlin
🔗 Слушать выпуск
🐸 Библиотека джависта #буст
🔹 Javaswag #75
Дата выпуска: 4 февраля 2025
Ведущий: Дмитрий Волыхин
Гость: Илья Ильиных
Продолжительность: 2 часа 24 минуты
В этом выпуске подкаста Javaswag обсуждаются причины перехода с Java на Go, преимущества Go по сравнению с Java, а также использование редактора Vim для повышения эффективности разработки.
🔹 Ключевые темы выпуска
00:00 — Переход от Java к Go
06:13 — Проблемы с Optional и его использование
11:20 — Использование Optional в Java
18:30 — Важность форматирования кода
23:42 — Проблемы и решения в команде
31:05 — Переход на Vim и его связь с GoLang
36:30 — Проблемы с Gradle и тестами
44:51 — Проекты и архитектура микросервисов
51:03 — Сравнение Go и Java
56:13 — Погружение в Go и его особенности
01:10:36 — Мутационное тестирование и его важность
01:16:09 — Сравнение тестирования в Java и Go
01:24:44 — Принципы написания устойчивых тестов
01:31:32 — Тестирование как черный ящик
01:37:13 — Интерфейсы в Go и Java
01:43:09 — Обработка ошибок в Go и Java
01:48:18 — Теория монады и её применение в Java
01:53:35 — Проблемы написания больших проектов на Go
02:04:50 — Итераторы в Go и Lua
02:13:26 — Эффективные методы работы с кодом
02:19:12 — Непопулярные мнения о потоках в Java и Kotlin
02:24:34 — Проблемы и решения в Java и Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
JavaRocks - канал доказывающий что Java-рулит.
Собираем лучшие посты со всего русскоязычного телеграм + пишем свои собственные мнения, фишки и трюки языка.
- основы
- трюки и фишки языка
- тесты на проверку знаний
- паттерны проектирования на Java
Подпишись и изучай Java. Никакой воды. @javarocks
Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqwMcqaU
Собираем лучшие посты со всего русскоязычного телеграм + пишем свои собственные мнения, фишки и трюки языка.
- основы
- трюки и фишки языка
- тесты на проверку знаний
- паттерны проектирования на Java
Подпишись и изучай Java. Никакой воды. @javarocks
Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqwMcqaU
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 OpenTelemetry и Kubernetes
Автор делится опытом миграции демо-приложения с Docker Compose на Helm в Kubernetes. Он описывает использование Helm subcharts для настройки инфраструктуры (Traefik, Jaeger, PostgreSQL) и приложений, а также демонстрирует изоляцию компонентов с помощью vCluster.
🔹 Тестирование Spring-контроллеров с MockMvcTester
Автор представляет MockMvcTester, новый инструмент в Spring Framework 6.2, который упрощает написание тестов контроллеров с использованием AssertJ-стиля. Он показывает, как интегрировать MockMvcTester в проекты на Spring Boot 3.4.0 и выше, и предоставляет примеры конфигурации для различных сценариев тестирования.
🔹 Создание надежного Docker-образа для Spring Boot-приложения
Автор рассматривает лучшие практики упаковки Spring Boot-приложений в Docker-образы. В статье обсуждаются методы диагностики сбоев, таких как OutOfMemoryError, с использованием heap dump и GC-логов, а также инструменты мониторинга, включая Spring Boot Actuator и Java Flight Recorder.
Please open Telegram to view this post
VIEW IN TELEGRAM