Java-совет: никогда не возвращайте
Если метод возвращает
Гораздо лучше всегда возвращать пустую коллекцию:
-
-
-
Тогда вызов становится безопасным, а код — чище.
Пример:
[плохо] (нужно проверять на
[хорошо] (без лишних проверок):
Теперь вызов можно писать так:
👉 Java Portal
null вместо коллекций.Если метод возвращает
null, вызывающий код вынужден делать бессмысленные проверки — а это источник багов.Гораздо лучше всегда возвращать пустую коллекцию:
-
Collections.emptyList()-
List.of()-
Set.of()Тогда вызов становится безопасным, а код — чище.
Пример:
[плохо] (нужно проверять на
null):public List<String> findUsers() {
if (!dataAvailable()) {
return null;
}
return loadUsers();
}[хорошо] (без лишних проверок):
public List<String> findUsers() {
if (!dataAvailable()) {
return Collections.emptyList();
}
return loadUsers();
}Теперь вызов можно писать так:
List<String> users = findUsers();
users.forEach(System.out::println); // без null-check
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2
Java: Используйте Comparator.nullsFirst() или Comparator.nullsLast() для безопасной сортировки.
Значения null могут привести к NullPointerException, если ваш компаратор не обрабатывает их явно.
Вот код, представленный на изображении:
Без использования
С использованием
В первом примере (BadSortingExample) код вызывает NullPointerException, так как возраст у одного из объектов null, и компаратор не обрабатывает это.
Во втором примере (GoodSortingExample) используется Comparator.nullsFirst(), что позволяет безопасно сортировать объекты, даже если одно из значений для возраста отсутствует.
👉 Java Portal
Значения null могут привести к NullPointerException, если ваш компаратор не обрабатывает их явно.
Вот код, представленный на изображении:
Без использования
nullsFirst или nullsLast:public class BadSortingExample {
static class Person {
String name;
Integer age;
Person(String name, Integer age) {
this.name = name;
this.age = age;
}
Integer getAge() {
return age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", null), // null age
new Person("Charlie", 25)
);
// This crashes at runtime
people.sort(Comparator.comparing(Person::getAge));
people.forEach(System.out::println);
}
}С использованием
nullsFirst:public class GoodSortingExample {
static class Person {
String name;
Integer age;
Person(String name, Integer age) {
this.name = name;
this.age = age;
}
Integer getAge() {
return age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", null), // null age handled safely
new Person("Charlie", 25)
);
// Safe: null ages go FIRST
people.sort(
Comparator.comparing(
Person::getAge,
Comparator.nullsFirst(Integer::compareTo)
)
);
people.forEach(System.out::println);
}
}В первом примере (BadSortingExample) код вызывает NullPointerException, так как возраст у одного из объектов null, и компаратор не обрабатывает это.
Во втором примере (GoodSortingExample) используется Comparator.nullsFirst(), что позволяет безопасно сортировать объекты, даже если одно из значений для возраста отсутствует.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2
Бесплатный API для извлечения всей информации по IP-адресу.
Без ограничений и каких-либо платежей.
Работает с Python, Java и любым другим языком.
→ http://ipquery.io
👉 Java Portal
Без ограничений и каких-либо платежей.
Работает с Python, Java и любым другим языком.
→ http://ipquery.io
Please open Telegram to view this post
VIEW IN TELEGRAM
Я только что нашел 100% открытый и полностью бесплатный заменитель Postman, который работает прямо в вашем браузере без необходимости установки.
Его название — Hoppscotch.
Без лишнего веса для десктопа. Без $14/месяц с пользователя. Без сбора данных.
HTTP, GraphQL, WebSocket, тестирование в реальном времени, генерация кодовых фрагментов и миграция из Postman в один клик. Включает десктопную версию и CLI.
100% Открытый исходный код. Лицензия MIT.
👉 Java Portal
Его название — Hoppscotch.
Без лишнего веса для десктопа. Без $14/месяц с пользователя. Без сбора данных.
HTTP, GraphQL, WebSocket, тестирование в реальном времени, генерация кодовых фрагментов и миграция из Postman в один клик. Включает десктопную версию и CLI.
100% Открытый исходный код. Лицензия MIT.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🌚3😁1
Spring Boot:
1.
2.
3. Нет Tomcat или других встроенных серверов
4. Запросы выполняются через
👉 Java Portal
@AutoConfigureMockMvc позволяет тестировать контроллеры без запуска сервера. Он указывает Spring Boot автоматически сконфигурировать экземпляр MockMvc в тестовом контексте.@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1));
}
}
1.
@SpringBootTest загружает полный контекст приложения.2.
@AutoConfigureMockMvc настраивает MockMvc.3. Нет Tomcat или других встроенных серверов
4. Запросы выполняются через
DispatcherServlet Spring внутри приложенияPlease open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2
Что такое Records в Java?
Records в Java — это специальный вид классов, введённый в Java 14 (в preview) и финализированный в Java 16, чтобы уменьшить boilerplate-код при создании простых immutable data-классов.
Они отлично подходят для:
- DTO
- моделей запросов/ответов REST API
- value objects (например, координаты, имена и т.д.)
Пример:
Что Records дают автоматически
Если объявить:
Java автоматически сгенерирует:
- конструктор
- геттеры (
-
- метод
Ограничения Records:
- поля неявно
- нельзя объявить конструктор без аргументов
- нельзя наследоваться от других классов (record неявно наследует
- нельзя изменять поля после создания объекта
- поверхностная неизменяемость: вложенные изменяемые объекты (например,
👉 Java Portal
Records в Java — это специальный вид классов, введённый в Java 14 (в preview) и финализированный в Java 16, чтобы уменьшить boilerplate-код при создании простых immutable data-классов.
Они отлично подходят для:
- DTO
- моделей запросов/ответов REST API
- value objects (например, координаты, имена и т.д.)
Пример:
record Book(String title, double price) {}
Book book = new Book("Cracking The java Interviews", 429.0);
System.out.println(book); // Book[title= Cracking The java Interviews, price=429.0]Что Records дают автоматически
Если объявить:
record Person(String name, int age) {}Java автоматически сгенерирует:
- конструктор
- геттеры (
name(), age())-
equals() и hashCode()- метод
toString()Ограничения Records:
- поля неявно
final- нельзя объявить конструктор без аргументов
- нельзя наследоваться от других классов (record неявно наследует
java.lang.Record)- нельзя изменять поля после создания объекта
- поверхностная неизменяемость: вложенные изменяемые объекты (например,
List) всё ещё могут изменятьсяPlease open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
❤3👍3
Java: Очень интересная библиотека под названием Sift заменяет криптичный, основанный на строках подход движка Java Regex на fluent API.
https://github.com/Mirkoddd/Sift
👉 Java Portal
// ПРИМЕР БАЗОВОГО ИСПОЛЬЗОВАНИЯ: паттерн hexColor ^#[0-9a-fA-F]{6}$
// Вы можете задать вышеуказанный паттерн более выразительным способом,
// используя DSL (domain-specific language) Sift
String hexColor = Sift.fromStart()
.character('#')
.then()
.exactly(6)
.hexDigits()
.andNothingElse()
.shake();
// Если вы используете Maven, чтобы скомпилировать приведённый выше пример,
// достаточно добавить следующую зависимость:
<!-- Core engine — без внешних зависимостей -->
<dependency>
<groupId>com.mirkoddd</groupId>
<artifactId>sift-core</artifactId>
<version>6.4.0</version>
</dependency>https://github.com/Mirkoddd/Sift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Совет по Java Spring Boot: используйте
Если API отвечает с ошибками или падает, вам не нужно вручную писать циклы с повторными попытками.
Аннотация
- автоматически повторять вызовы при возникновении определённых исключений
- управлять количеством попыток
- настраивать задержку и экспоненциальный backoff
- выполнять fallback через
Например, на картинке:
- выполняется 3 попытки при указанных исключениях
- стартовая задержка — 2 секунды, далее она удваивается при каждой попытке
- вызывается
Это удобно, читаемо и избавляет от boilerplate-кода при интеграции с внешними API.
👉 Java Portal
@Retryable для обработки нестабильных внешних сервисов.Если API отвечает с ошибками или падает, вам не нужно вручную писать циклы с повторными попытками.
Аннотация
@Retryable позволяет:- автоматически повторять вызовы при возникновении определённых исключений
- управлять количеством попыток
- настраивать задержку и экспоненциальный backoff
- выполнять fallback через
@Recover, если всё равно не удалосьНапример, на картинке:
- выполняется 3 попытки при указанных исключениях
- стартовая задержка — 2 секунды, далее она удваивается при каждой попытке
- вызывается
recover(), если все попытки исчерпаныЭто удобно, читаемо и избавляет от boilerplate-кода при интеграции с внешними API.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Честно говоря, это самая точная диаграмма, которую я видел.
Waterfall: планируешь 18 месяцев и в итоге доставляешь именно то, что уже никому не нужно.
Agile: на каждом этапе поставляешь что-то пригодное к использованию, но CEO постоянно спрашивает: «Где машина?»
AI: ты получаешь машину в первый же день. У неё шесть колёс, двери установлены задом наперёд, и есть ракетная установка. Ты тратишь больше времени не на «разработку», а на адаптацию под себя, контроль и валидацию. Это и делают сейчас лучшие AI-разработчики. Они не строят. Они формируют и берут ответственность.
👉 Java Portal
Waterfall: планируешь 18 месяцев и в итоге доставляешь именно то, что уже никому не нужно.
Agile: на каждом этапе поставляешь что-то пригодное к использованию, но CEO постоянно спрашивает: «Где машина?»
AI: ты получаешь машину в первый же день. У неё шесть колёс, двери установлены задом наперёд, и есть ракетная установка. Ты тратишь больше времени не на «разработку», а на адаптацию под себя, контроль и валидацию. Это и делают сейчас лучшие AI-разработчики. Они не строят. Они формируют и берут ответственность.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
Spring Boot: используйте TaskScheduler для реализации лёгких динамических задач. Для более сложных сценариев стоит рассмотреть Quartz.
✅ Инжектим и используем:
Внедрённый бин — это ThreadPoolTaskScheduler, встроенная реализация как TaskScheduler, так и ScheduledExecutorService.
✅ При необходимости можно настроить его конфигурацию:
👉 Java Portal
...
@Autowired
TaskScheduler scheduler;
scheduler.schedule(
() -> System.out.println("Hello!"),
new CronTrigger("0 */5 * * * *") // каждые 5 минут
);
...
Внедрённый бин — это ThreadPoolTaskScheduler, встроенная реализация как TaskScheduler, так и ScheduledExecutorService.
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("my-scheduler-");
scheduler.initialize();
return scheduler;
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Полезняшка: парень сделал небольшой плагин для IntelliJ IDEA для вещи, которая раздражала многих годами:
https://github.com/saket/intellij-comment-continuation
Плагин для IntelliJ IDEA, который продолжает
👉 Java Portal
https://github.com/saket/intellij-comment-continuation
Плагин для IntelliJ IDEA, который продолжает
// комментарии на следующей строке при нажатии Enter с сохранением отступа. Повторное нажатие Enter на пустой строке комментария завершает блок комментариев и сохраняет тот же уровень отступа.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥5
Один из самых ценных паттернов в Java на продакшене: неизменяемые DTO с использованием Records + Builder.
В реальных Java-приложениях (Spring Boot API, микросервисы, event-системы) мы создаем сотни DTO.
Лучший современный паттерн в 2026 году:
Records (неизменяемые по умолчанию) + паттерн Builder для гибкой инициализации.
Преимущества:
- Неизменяемость → потокобезопасность и предсказуемость
- Нет boilerplate-кода с геттерами/сеттерами
- Builder дает удобный fluent API для опциональных полей
- Отличная интеграция с Jackson, валидацией и MapStruct
Реалистичный пример из продакшена ниже:
👉 Java Portal
В реальных Java-приложениях (Spring Boot API, микросервисы, event-системы) мы создаем сотни DTO.
Лучший современный паттерн в 2026 году:
Records (неизменяемые по умолчанию) + паттерн Builder для гибкой инициализации.
Преимущества:
- Неизменяемость → потокобезопасность и предсказуемость
- Нет boilerplate-кода с геттерами/сеттерами
- Builder дает удобный fluent API для опциональных полей
- Отличная интеграция с Jackson, валидацией и MapStruct
Реалистичный пример из продакшена ниже:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Продвинутый совет по Spring
Превратите структуру вашего Spring-проекта в тестируемый контракт, который никогда не будет незаметно деградировать.
С помощью Taikai вы можете принудительно проверять архитектурные ограничения с использованием предопределённых правил ArchUnit, см. документацию.
https://github.com/enofex/taikai
👉 Java Portal
Превратите структуру вашего Spring-проекта в тестируемый контракт, который никогда не будет незаметно деградировать.
С помощью Taikai вы можете принудительно проверять архитектурные ограничения с использованием предопределённых правил ArchUnit, см. документацию.
https://github.com/enofex/taikai
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Совет по Java: избегайте накладных расходов на boxing, используя потоки примитивов.
❌ Создание объектов Integer для каждого значения:
✅ Работа напрямую с int:
✅ Другие классы потоков примитивов:
👉 Java Portal
Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sumBoxed = boxed.reduce(0, Integer::sum);
int sumPrimitive = IntStream.of(1, 2, 3, 4, 5).sum();
LongStream, DoubleStream
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Spring Boot — большой фреймворк, на освоение которого могут уйти годы. Но, на мой взгляд, достаточно знать ключевые возможности и иметь практический опыт с наиболее часто используемыми фичами, чтобы считаться “готовым к работе”.
Roadmap для начинающих по Spring Boot : читать
👉 Java Portal
Roadmap для начинающих по Spring Boot : читать
Please open Telegram to view this post
VIEW IN TELEGRAM
Reddit
From the springboot_learners community on Reddit
Explore this post and more from the springboot_learners community
❤3
Совет по Java: начиная с Java 15 можно использовать
Работает как
Вместо:
Можно написать:
Также хорошо работает с многострочным форматированием:
👉 Java Portal
String.formatted(...) для форматирования строк вместо String.format(...).Работает как
String.format, но выглядит немного чище и понятнее:Вместо:
String message = String.format("Hello %s, you have %d messages", user, count);
System.out.println(String.format("Hello %s, you have %d messages", user, count));Можно написать:
String message = "Hello %s, you have %d messages".formatted(user, count);
System.out.println("Hello %s, you have %d messages".formatted(user, count));
Также хорошо работает с многострочным форматированием:
String json = """
{
"user": "%s",
"messages": %d
}
""".formatted(user, count);
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5🔥4
Java Spring Boot: Не допускайте эту ошибку с фильтрами/интерцепторами
Многие используют фильтры и интерцепторы неправильно
Они должны использоваться только для сквозных задач
(то есть для того, что применяется ко ВСЕМ запросам)
Примеры корректного использования:
[Фильтры]:
- CORS
- Кодировка
[Интерцепторы]:
- Аутентификация/Авторизация
- Метрики/Логирование
- Локаль
- Общие заголовки
[Основная ошибка]:
размещать там бизнес-логику
Например:
- выполнение запросов к базе данных
- проверка подписок
- сложная логика
Почему это плохо:
- выполняется для КАЖДОГО запроса
- создаёт дополнительную нагрузку
- нарушает архитектуру
- усложняет тестирование
Вывод:
- интерцептор превращается в «мусорный слой»
Как делать правильно:
- бизнес-логика → в сервисах
- контроллеры → оркестрация
👉 Java Portal
Многие используют фильтры и интерцепторы неправильно
Они должны использоваться только для сквозных задач
(то есть для того, что применяется ко ВСЕМ запросам)
Примеры корректного использования:
[Фильтры]:
- CORS
- Кодировка
[Интерцепторы]:
- Аутентификация/Авторизация
- Метрики/Логирование
- Локаль
- Общие заголовки
[Основная ошибка]:
размещать там бизнес-логику
Например:
- выполнение запросов к базе данных
- проверка подписок
- сложная логика
Почему это плохо:
- выполняется для КАЖДОГО запроса
- создаёт дополнительную нагрузку
- нарушает архитектуру
- усложняет тестирование
Вывод:
- интерцептор превращается в «мусорный слой»
Как делать правильно:
- бизнес-логика → в сервисах
- контроллеры → оркестрация
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
Совет по Java : Если нужно посчитать количество вхождений элемента в списке, можно использовать
#Java #Collections
👉 Java Portal
Collections.frequency(...).#Java #Collections
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3
Большинство проектов на Spring Boot обрабатывают конфигурацию одинаково: плоские классы с
В Apereo CAS — более 1000 свойств в 633 конфигурационных классах. Автор написал статью о том, как система конфигурации остаётся навигируемой при таком масштабе:
https://medium.com/all-things-software/spring-boot-configuration-properties-at-scale-884f494721ac
👉 Java Portal
@ConfigurationProperties, строковые имена свойств и надежда на то, что все прочитают README.В Apereo CAS — более 1000 свойств в 633 конфигурационных классах. Автор написал статью о том, как система конфигурации остаётся навигируемой при таком масштабе:
https://medium.com/all-things-software/spring-boot-configuration-properties-at-scale-884f494721ac
Please open Telegram to view this post
VIEW IN TELEGRAM
Medium
Spring Boot Configuration Properties at Scale
Apereo CAS manages 1,000+ settings across 633 classes using standard Spring Boot patterns. Here’s what your project can steal.
❤3
Java 21 открывает новую эпоху конкурентности с виртуальными потоками — лёгкими потоками, управляемыми JVM, которые значительно повышают производительность I/O-bound приложений.
Подробнее - https://lttr.ai/Ap1Np
#Java #MongoDB #VirtualThread
👉 Java Portal
Подробнее - https://lttr.ai/Ap1Np
#Java #MongoDB #VirtualThread
Please open Telegram to view this post
VIEW IN TELEGRAM
DEV Community
Java Virtual Threads in Action: Optimizing MongoDB Operation
This article was written by Otavio Santana, a renowned contributor to the Java and open-source...
❤2