Разберём Java records: 7 приёмов для компактных моделей данных!
Records помогают быстро описывать неизменяемые объекты без лишнего шаблонного кода. Эта шпора пригодится для DTO, value objects, событий, ответов API и небольших внутренних моделей, где важны читаемость и предсказуемое поведение.
👉 Java Ready | #шпора
Records помогают быстро описывать неизменяемые объекты без лишнего шаблонного кода. Эта шпора пригодится для DTO, value objects, событий, ответов API и небольших внутренних моделей, где важны читаемость и предсказуемое поведение.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤3👍3🤝3
Чем полезен List.copyOf() в Java?
Иногда объект получает список извне и сохраняет его в поле:
На первый взгляд всё нормально. Но если внешний код потом изменит список, изменится и состояние Order:
Теперь внутри order тоже может оказаться новый элемент, хотя сам Order его не добавлял.
Чтобы защититься, можно сделать копию:
Теперь объект хранит собственный неизменяемый снимок списка:
Если исходный список изменится позже, поле внутри Order уже не поменяется:
И сам список внутри Order нельзя случайно изменить:
Обычно такой список удобно возвращать наружу:
Потому что вызывающий код не сможет незаметно изменить внутреннее состояние объекта.
Важно: List.copyOf() не принимает null-элементы:
List.copyOf() полезен для защитного копирования. Он помогает не отдавать внутреннее состояние объекта под управление внешнего кода.
👉 Java Ready | #совет
Иногда объект получает список извне и сохраняет его в поле:
public Order(List<String> items) {
this.items = items;
}На первый взгляд всё нормально. Но если внешний код потом изменит список, изменится и состояние Order:
List<String> source = new ArrayList<>();
source.add("book");
Order order = new Order(source);
source.add("phone");
Теперь внутри order тоже может оказаться новый элемент, хотя сам Order его не добавлял.
Чтобы защититься, можно сделать копию:
this.items = List.copyOf(items);
Теперь объект хранит собственный неизменяемый снимок списка:
public Order(List<String> items) {
this.items = List.copyOf(items);
}Если исходный список изменится позже, поле внутри Order уже не поменяется:
source.add("phone");
// order всё ещё хранит старый наборИ сам список внутри Order нельзя случайно изменить:
order.items().add("tablet"); // UnsupportedOperationExceptionОбычно такой список удобно возвращать наружу:
public List<String> items() {
return items;
}Потому что вызывающий код не сможет незаметно изменить внутреннее состояние объекта.
Важно: List.copyOf() не принимает null-элементы:
List.copyOf(List.of("a", null)); // NullPointerExceptionList.copyOf() полезен для защитного копирования. Он помогает не отдавать внутреннее состояние объекта под управление внешнего кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥2
Разберём CompletableFuture: 7 приёмов для асинхронного кода в Java!
CompletableFuture помогает запускать задачи параллельно, связывать async-операции, объединять результаты, обрабатывать ошибки и ограничивать время ожидания. Эта шпора пригодится, когда нужно писать неблокирующий код без хаоса из callback-ов.
👉 Java Ready | #шпора
CompletableFuture помогает запускать задачи параллельно, связывать async-операции, объединять результаты, обрабатывать ошибки и ограничивать время ожидания. Эта шпора пригодится, когда нужно писать неблокирующий код без хаоса из callback-ов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤5👍4
Маскируем секреты в URL!
Нужно логировать ссылки без риска утечки токенов? Пишем небольшой санитайзер, который находит опасные query-параметры и заменяет их значения на ****.
В этой задаче:
Такой подход помогает сохранять полезные логи для отладки, но не светить секреты в консоли, error reports и лог-файлах.
👉 Java Ready | #задача
Нужно логировать ссылки без риска утечки токенов? Пишем небольшой санитайзер, который находит опасные query-параметры и заменяет их значения на ****.
В этой задаче:
• Разбираем URL через URI;
• Проверяем имена query-параметров;
• Скрываем token, password и api_key.
Такой подход помогает сохранять полезные логи для отладки, но не светить секреты в консоли, error reports и лог-файлах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
Например,
/bin содержит системные бинарные файлы, а /etc — конфигурации, управляющие поведением системы.На картинке — директории Linux, их назначение и место в иерархии.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥7❤3
Когда в Java стоит использовать Objects.requireNonNull()?
Иногда параметр метода не должен быть null вообще. Например, сервису нужен репозиторий, обработчику нужен клиент, а объекту доменной модели обязательное имя.
Часто это проверяют вручную:
Работает, но код становится шумным.
В Java для такой проверки есть Objects.requireNonNull():
Если передать null, ошибка появится сразу в конструкторе, а не где-то позже при первом вызове метода.
Можно добавить понятное сообщение:
Это особенно полезно в конструкторах:
И в методах, где null ломает смысл операции:
Но не стоит ставить requireNonNull() везде подряд. Если null нормальный вариант состояния, лучше явно отразить это в логике:
Objects.requireNonNull() хорош там, где null является ошибкой. Он помогает падать раньше и ближе к месту неправильного вызова.
👉 Java Ready | #совет
Иногда параметр метода не должен быть null вообще. Например, сервису нужен репозиторий, обработчику нужен клиент, а объекту доменной модели обязательное имя.
Часто это проверяют вручную:
public UserService(UserRepository repository) {
if (repository == null) {
throw new NullPointerException("repository");
}
this.repository = repository;
}Работает, но код становится шумным.
В Java для такой проверки есть Objects.requireNonNull():
public UserService(UserRepository repository) {
this.repository = Objects.requireNonNull(repository);
}Если передать null, ошибка появится сразу в конструкторе, а не где-то позже при первом вызове метода.
Можно добавить понятное сообщение:
this.repository = Objects.requireNonNull(
repository,
"repository must not be null"
);
Это особенно полезно в конструкторах:
public Order(String id, BigDecimal amount) {
this.id = Objects.requireNonNull(id, "id");
this.amount = Objects.requireNonNull(amount, "amount");
}И в методах, где null ломает смысл операции:
public void send(Message message) {
Objects.requireNonNull(message, "message");
transport.send(message);
}Но не стоит ставить requireNonNull() везде подряд. Если null нормальный вариант состояния, лучше явно отразить это в логике:
String label = user.getNickname() != null
? user.getNickname()
: user.getName();
Objects.requireNonNull() хорош там, где null является ошибкой. Он помогает падать раньше и ближе к месту неправильного вызова.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤4👍4
Полезная статья о том, как использовать RabbitMQ вместе с Java Spring!
В этой статье:
• Как два микросервиса могут общаться через очередь сообщений
• Что делают producer, consumer, exchange и queue
• Как собрать простой пример на Spring и RabbitMQ без лишней теории
👉 Java Ready | #статья
В этой статье:
• Как два микросервиса могут общаться через очередь сообщений
• Что делают producer, consumer, exchange и queue
• Как собрать простой пример на Spring и RabbitMQ без лишней теории
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥1
Шпаргалка по регулярным выражениям в Java!
Например, \d ищет цифру, \w — word-символ, а Pattern.CASE_INSENSITIVE включает поиск без учёта регистра.
На картинке Java Regex: character classes, Pattern и Matcher, predefined classes, boundary matches, flags, quantifiers, groups, backreferences и logical operations.
Сохрани, чтобы не потерять!
👉 Java Ready | #совет
Например, \d ищет цифру, \w — word-символ, а Pattern.CASE_INSENSITIVE включает поиск без учёта регистра.
На картинке Java Regex: character classes, Pattern и Matcher, predefined classes, boundary matches, flags, quantifiers, groups, backreferences и logical operations.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4🔥4
Делаем простую валидацию DTO на Java!
Перед сохранением данных часто нужно проверить входной объект: email не пустой, возраст нормальный, имя задано. Соберём небольшую ручную валидацию без фреймворков.
Пусть есть DTO:
Ошибки удобно хранить списком:
Проверим обязательные строки:
Добавим простые бизнес-правила:
Теперь код обработки становится понятным:
Можно вынести повторяющуюся проверку в метод:
И использовать короче:
Ручная валидация полезна для небольших задач, CLI-утилит и мест, где не хочется тащить фреймворк. Главное, возвращать все ошибки сразу, а не падать на первой.
👉 Java Ready | #практика
Перед сохранением данных часто нужно проверить входной объект: email не пустой, возраст нормальный, имя задано. Соберём небольшую ручную валидацию без фреймворков.
Пусть есть DTO:
record CreateUserRequest(
String email,
String name,
int age
) {}
Ошибки удобно хранить списком:
List<String> validate(CreateUserRequest request) {
List<String> errors = new ArrayList<>();Проверим обязательные строки:
if (request.email() == null || request.email().isBlank()) {
errors.add("email is required");
}
if (request.name() == null || request.name().isBlank()) {
errors.add("name is required");
}Добавим простые бизнес-правила:
if (request.age() < 18) {
errors.add("age must be 18 or greater");
}
return errors;
}Теперь код обработки становится понятным:
var errors = validate(request);
if (!errors.isEmpty()) {
return errors;
}
Можно вынести повторяющуюся проверку в метод:
boolean blank(String value) {
return value == null || value.isBlank();
}И использовать короче:
if (blank(request.email())) {
errors.add("email is required");
}Ручная валидация полезна для небольших задач, CLI-утилит и мест, где не хочется тащить фреймворк. Главное, возвращать все ошибки сразу, а не падать на первой.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥2
Media is too big
VIEW IN TELEGRAM
Java Design Patterns — большая база паттернов проектирования на Java!
На сайте собраны паттерны проектирования, архитектурные приёмы, принципы и готовые Java-примеры с объяснениями. Можно листать каталог по разделам, открывать конкретный паттерн, смотреть его идею, применимость, структуру и код. Есть не только классика вроде Factory, Builder, Adapter и Observer, но и более специфичные паттерны для enterprise-разработки, concurrency, integration и cloud-native подходов. Хороший ресурс, чтобы не просто заучивать названия паттернов, а видеть, как они выглядят в нормальном Java-коде.
👉 Java Ready | #ресурс
На сайте собраны паттерны проектирования, архитектурные приёмы, принципы и готовые Java-примеры с объяснениями. Можно листать каталог по разделам, открывать конкретный паттерн, смотреть его идею, применимость, структуру и код. Есть не только классика вроде Factory, Builder, Adapter и Observer, но и более специфичные паттерны для enterprise-разработки, concurrency, integration и cloud-native подходов. Хороший ресурс, чтобы не просто заучивать названия паттернов, а видеть, как они выглядят в нормальном Java-коде.
Оставляю ссылочку: java-design-patterns.com
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4🔥3
Как в Java избежать лишней работы через Optional.orElseGet()?
Optional часто используют, чтобы взять значение или подставить fallback:
На первый взгляд всё нормально. Но
Например:
Если fallback дорогой: запрос в базу, чтение файла, HTTP-вызов или тяжёлый расчёт — это лишняя работа.
Для ленивого fallback есть
Теперь fallback выполнится только если Optional пустой:
Разница особенно заметна в сервисном коде:
Если пользователь уже есть в кэше, база не трогается.
А
Если fallback нужно вычислять, используй orElseGet(). Если значение уже готово то orElse() вполне подходит.
👉 Java Ready | #совет
Optional часто используют, чтобы взять значение или подставить fallback:
String name = userName.orElse(loadDefaultName());
На первый взгляд всё нормально. Но
loadDefaultName() выполнится всегда, даже если внутри Optional уже есть значение.Например:
Optional<String> name = Optional.of("Alice");
String result = name.orElse(expensiveFallback());expensiveFallback() всё равно будет вызван.Если fallback дорогой: запрос в базу, чтение файла, HTTP-вызов или тяжёлый расчёт — это лишняя работа.
Для ленивого fallback есть
orElseGet():String result = name.orElseGet(() -> expensiveFallback());
Теперь fallback выполнится только если Optional пустой:
Optional<String> empty = Optional.empty();
String result = empty.orElseGet(() -> expensiveFallback());
Разница особенно заметна в сервисном коде:
User user = cachedUser.orElseGet(() -> loadFromDatabase(id));
Если пользователь уже есть в кэше, база не трогается.
А
orElse() лучше оставлять для простых готовых значений:String label = name.orElse("Anonymous");Если fallback нужно вычислять, используй orElseGet(). Если значение уже готово то orElse() вполне подходит.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
Разбираем Collectors: 7 полезных приёмов для агрегации данных в Java!
Когда нужно не просто пройтись по списку, а сгруппировать элементы, собрать Map, посчитать статистику или подготовить вложенную структуру, обычного map/filter часто уже мало. Эти Collectors помогают писать компактнее и не превращать обработку коллекций в ручные циклы с временными Map и List.
👉 Java Ready | #шпора
Когда нужно не просто пройтись по списку, а сгруппировать элементы, собрать Map, посчитать статистику или подготовить вложенную структуру, обычного map/filter часто уже мало. Эти Collectors помогают писать компактнее и не превращать обработку коллекций в ручные циклы с временными Map и List.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍4❤2