Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
🔥Пожалуй самый распространенный способ избежания Null Pointer Exception в вашем приложении.

Часто можно получить NPE при проверке на равенство переменной и константы. Дело в том, что переменная может содержать null и при вызове метода equals у такой переменной, мы получим исключение NullPointerException.

Решение это всегда менять местами переменную и константу. То есть вызвать метод equals у константы.
👍163
6.png
53.8 KB
🚀 Stream API появился в Java 8 и существенно упростил работу с коллекциями. Теперь можно писать короче и красивее фильтрацию, сортировку и обработку данных.

В карусели приведены полезные примеры использования стримов.
🔥82👍1
🚩 Double braces инициализация - это создание и инициализация объекта в одном java выражении. Чаще всего используется с коллекциями.

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

Плюсы: код выглядит проще, красивее и понятнее.

Минусы:
📍 малоизвестный способ инициализации
📍 каждый раз создается дополнительный класс
📍 не работает, если класс, который мы пытаемся расширить, помечен как final
📍 содержит скрытую ссылку на внешний экземпляр, что может привести к утечкам памяти

Именно из за этих минусов данная инициализация является антипаттерном.

В современных версиях java есть более красивые и правильные варианты создания и инициализации коллекций.
Начиная с Java 8 это Stream API, а начиная с java 9 конструкция List.of().
👍62
Sentry for Java — это программный инструмент, призванный помочь разработчикам отслеживать и управлять ошибками, исключениями и сбоями в приложениях Java.

Sentry интегрируется с вашими Java-приложениями, позволяя фиксировать и сообщать об ошибках и исключениях в режиме реального времени. Он предоставляет подробную информацию о контексте, в котором произошли ошибки, включая трассировки стека, информацию о пользователе и данные об окружении. Это помогает разработчикам быстро выявлять и устранять проблемы, повышая общую надежность и удобство использования своих приложений.

Ошибки которые не обрабатываются, Sentry соберёт автоматически, а те которые вы обработали, можно отправить вручную:

} catch (Exception e) {
Sentry.addBreadcrumb("readFile");
Sentry.captureException(e);
}


Подключение: добавить зависимость sentry-spring-boot-starter и прописать в конфиге sentry.dsn
🥰4👍2
📝 Запись (record) — это класс, объявленный с ключевым словом record вместо ключевого слова class. Запись служит контейнером неизменяемых данных и предназначена для лаконичного описания DTO (Data Transfer Object).

Класс, который компилятор создает для вас при создании записи, является окончательным (final).

Этот класс расширяет класс java.lang.Record. Таким образом, ваша запись не может расширять какой-либо класс.

Запись, как и класс, может реализовывать любое количество интерфейсов.

Блок, который следует сразу за именем записи, — (int x, int y) объявляет компоненты записи. Для каждого компонента записи компилятор создает private final поле и метод доступа к нему с тем же именем, что и у этого компонента. В записи может быть объявлено любое количество компонентов.

Компилятор сам создаёт конструктор со всеми перечисленными компонентами записи, а так же реализует методы toString(), equals() и hashCode() с реализацией по умолчанию.

record появился в Java 16.
🔥3
Защита от повторного запроса с помощью БД

Если вы разрабатываете Веб-приложение или REST-сервис, то рано или поздно столкнётесь с повторными запросами. Что имеется в виду? Объясню на примере Веб-страницы с кнопкой. По нажатию на кнопку, на бэкенд отправляется запрос. Запрос, соответственно, синхронный и пока серверная часть делает какую-то работу, браузер клиента показывает, что загружает страницу. Если это происходит продолжительное время, клиент может подумать, что его запрос завис и нажать кнопку ещё раз. Также повторное нажатие может произойти случайно.

Какая тут может произойти проблема? Если это, например, какой-то запрос данных, то в общем-то проблемы и нет, но если это действие, которое должно отработать только один раз, то тут могут быть весьма неприятные последствия. Для примера в интернет-магазине собрана корзина и создан заказ на оплату (статус REGISTERED), далее по нажатию кнопки "оплатить" с клиента списывают деньги и переводят заказ в статус оплачен (PAID). И если в этом процессе произойдёт двойной запрос, то с клиента могут списать деньги за заказ два раза.

Читать статью
👏62👍1
🔄 Бесконечные потоки

Интерфейс Stream имеет два статических метода для генерации бесконечных потоков: iterate() и generate().

iterate(final T seed, final UnaryOperator<T> f) возвращает бесконечный последовательный упорядоченный поток, созданный путем итеративного применения функции f к исходному элементу начального значения, создавая поток, состоящий из начального числа, f(начальное число), f(f(начальное число)) и т. д.

generate(Supplier<? extends T> s) возвращает бесконечный последовательный неупорядоченный поток, в котором каждый элемент создается предоставленным поставщиком (Supplier). Это подходит для генерации константных потоков, потоков случайных элементов и т. д.

📌 При работе с бесконечными потоками, крайне важно вызвать метод limit() перед вызовом терминальной операции, иначе наша программа будет работать бесконечно.
😁3👍1