🔥Пожалуй самый распространенный способ избежания Null Pointer Exception в вашем приложении.
Часто можно получить
Решение это всегда менять местами переменную и константу. То есть вызвать метод equals у константы.
Часто можно получить
NPE при проверке на равенство переменной и константы. Дело в том, что переменная может содержать null и при вызове метода equals у такой переменной, мы получим исключение NullPointerException. Решение это всегда менять местами переменную и константу. То есть вызвать метод equals у константы.
👍16❤3
6.png
53.8 KB
🚀 Stream API появился в Java 8 и существенно упростил работу с коллекциями. Теперь можно писать короче и красивее фильтрацию, сортировку и обработку данных.
В карусели приведены полезные примеры использования стримов.
В карусели приведены полезные примеры использования стримов.
🔥8☃2👍1
🚩 Double braces инициализация - это создание и инициализация объекта в одном java выражении. Чаще всего используется с коллекциями.
На самом деле в этот момент происходит создание анонимного внутреннего класса, расширяющего ArrayList и определение в нём блока инициализации экземпляра.
Плюсы: код выглядит проще, красивее и понятнее.
Минусы:
📍 малоизвестный способ инициализации
📍 каждый раз создается дополнительный класс
📍 не работает, если класс, который мы пытаемся расширить, помечен как final
📍 содержит скрытую ссылку на внешний экземпляр, что может привести к утечкам памяти
Именно из за этих минусов данная инициализация является антипаттерном.
В современных версиях java есть более красивые и правильные варианты создания и инициализации коллекций.
Начиная с Java 8 это Stream API, а начиная с java 9 конструкция List.of().
На самом деле в этот момент происходит создание анонимного внутреннего класса, расширяющего ArrayList и определение в нём блока инициализации экземпляра.
Плюсы: код выглядит проще, красивее и понятнее.
Минусы:
📍 малоизвестный способ инициализации
📍 каждый раз создается дополнительный класс
📍 не работает, если класс, который мы пытаемся расширить, помечен как final
📍 содержит скрытую ссылку на внешний экземпляр, что может привести к утечкам памяти
Именно из за этих минусов данная инициализация является антипаттерном.
В современных версиях java есть более красивые и правильные варианты создания и инициализации коллекций.
Начиная с Java 8 это Stream API, а начиная с java 9 конструкция List.of().
👍6❤2
Sentry for Java — это программный инструмент, призванный помочь разработчикам отслеживать и управлять ошибками, исключениями и сбоями в приложениях Java.
Sentry интегрируется с вашими Java-приложениями, позволяя фиксировать и сообщать об ошибках и исключениях в режиме реального времени. Он предоставляет подробную информацию о контексте, в котором произошли ошибки, включая трассировки стека, информацию о пользователе и данные об окружении. Это помогает разработчикам быстро выявлять и устранять проблемы, повышая общую надежность и удобство использования своих приложений.
Ошибки которые не обрабатываются, Sentry соберёт автоматически, а те которые вы обработали, можно отправить вручную:
Подключение: добавить зависимость sentry-spring-boot-starter и прописать в конфиге sentry.dsn
Sentry интегрируется с вашими Java-приложениями, позволяя фиксировать и сообщать об ошибках и исключениях в режиме реального времени. Он предоставляет подробную информацию о контексте, в котором произошли ошибки, включая трассировки стека, информацию о пользователе и данные об окружении. Это помогает разработчикам быстро выявлять и устранять проблемы, повышая общую надежность и удобство использования своих приложений.
Ошибки которые не обрабатываются, Sentry соберёт автоматически, а те которые вы обработали, можно отправить вручную:
} catch (Exception e) {
Sentry.addBreadcrumb("readFile");
Sentry.captureException(e);
}Подключение: добавить зависимость sentry-spring-boot-starter и прописать в конфиге sentry.dsn
🥰4👍2
📝 Запись (record) — это класс, объявленный с ключевым словом
Класс, который компилятор создает для вас при создании записи, является окончательным (
Этот класс расширяет класс
Запись, как и класс, может реализовывать любое количество интерфейсов.
Блок, который следует сразу за именем записи, —
Компилятор сам создаёт конструктор со всеми перечисленными компонентами записи, а так же реализует методы
record появился в Java 16.
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). И если в этом процессе произойдёт двойной запрос, то с клиента могут списать деньги за заказ два раза.
Читать статью
Если вы разрабатываете Веб-приложение или REST-сервис, то рано или поздно столкнётесь с повторными запросами. Что имеется в виду? Объясню на примере Веб-страницы с кнопкой. По нажатию на кнопку, на бэкенд отправляется запрос. Запрос, соответственно, синхронный и пока серверная часть делает какую-то работу, браузер клиента показывает, что загружает страницу. Если это происходит продолжительное время, клиент может подумать, что его запрос завис и нажать кнопку ещё раз. Также повторное нажатие может произойти случайно.
Какая тут может произойти проблема? Если это, например, какой-то запрос данных, то в общем-то проблемы и нет, но если это действие, которое должно отработать только один раз, то тут могут быть весьма неприятные последствия. Для примера в интернет-магазине собрана корзина и создан заказ на оплату (статус REGISTERED), далее по нажатию кнопки "оплатить" с клиента списывают деньги и переводят заказ в статус оплачен (PAID). И если в этом процессе произойдёт двойной запрос, то с клиента могут списать деньги за заказ два раза.
Читать статью
Хабр
Защита от повторного запроса с помощью БД
Если вы разрабатываете Веб-приложение или REST-сервис, то рано или поздно столкнётесь с повторными запросами. Что имеется в виду? Объясню на примере Веб-страницы с кнопкой. По нажатию на кнопку, на...
👏6❤2👍1
🔄 Бесконечные потоки
Интерфейс Stream имеет два статических метода для генерации бесконечных потоков:
iterate
generate
📌 При работе с бесконечными потоками, крайне важно вызвать метод limit() перед вызовом терминальной операции, иначе наша программа будет работать бесконечно.
Интерфейс Stream имеет два статических метода для генерации бесконечных потоков:
iterate() и generate().iterate
(final T seed, final UnaryOperator<T> f) возвращает бесконечный последовательный упорядоченный поток, созданный путем итеративного применения функции f к исходному элементу начального значения, создавая поток, состоящий из начального числа, f(начальное число), f(f(начальное число)) и т. д.generate
(Supplier<? extends T> s) возвращает бесконечный последовательный неупорядоченный поток, в котором каждый элемент создается предоставленным поставщиком (Supplier). Это подходит для генерации константных потоков, потоков случайных элементов и т. д.📌 При работе с бесконечными потоками, крайне важно вызвать метод limit() перед вызовом терминальной операции, иначе наша программа будет работать бесконечно.
😁3👍1
Varargs (Variable Arguments List, изменяющийся список аргументов) — это способ создания методов, которые могут принимать произвольное количество аргументов одного типа (от нуля и более). Данная возможность появилась в JDK 5.
Запись вида
При этом три точки после типа указывают, что метод в качестве аргумента может принимать как массив, так и любую последовательность аргументов, записанных через запятую, которая все равно преобразуется в одномерный массив - «под капотом» компилятор на уровне байт-кода неявно заменяет переданную последовательность массивом. Уже в методе аргумент varargs используется как одномерный массив.
Альтернативой varargs является перегрузка методов или передача в метод массива значений.
Varargs был создан с целью упрощения работы программиста, удобства и краткости кода.
📌 В качестве ограничения любой метод может использовать varargs только в единственном числе и строго последним аргументом.
Запись вида
Object... args и есть varargs. При этом три точки после типа указывают, что метод в качестве аргумента может принимать как массив, так и любую последовательность аргументов, записанных через запятую, которая все равно преобразуется в одномерный массив - «под капотом» компилятор на уровне байт-кода неявно заменяет переданную последовательность массивом. Уже в методе аргумент varargs используется как одномерный массив.
Альтернативой varargs является перегрузка методов или передача в метод массива значений.
Varargs был создан с целью упрощения работы программиста, удобства и краткости кода.
📌 В качестве ограничения любой метод может использовать varargs только в единственном числе и строго последним аргументом.
❤🔥7👍3🔥2
Унарный оператор - это оператор, который принимает на вход один аргумент и возвращает некоторое значение.
К унарным операторам относятся: +, -, !
А так же, пре-унарный оператор и пост-унарный оператор.
- (оператор смены знака)
Собственно это всё что он делает - меняет знак переданного аргумента. Ещё есть побочный эффект от применения этого оператора, это повышение типа до int, в случае если аргумент имеет тип byte, short или char.
! - оператор логической инверсии. Применяется только к переменным типа boolean и превращает значение из true в false и наоборот.
Операторы инкремента (++) и декремента (--) применяются к целочисленным переменным и обладают двумя вариациям:
пост-инкремент/декремент (i++ и i--)
пре-инкремент/декремент (++i и --i)
Разница между вариациями в том, что ++i увеличивает переменную и возвращает новое значение, а i++ возвращает старое значение, а только затем увеличивает переменную.
Что же делает унарный + ? Да ничего не делает, только имеет такой же побочный эффект как и унарный -.
К унарным операторам относятся: +, -, !
А так же, пре-унарный оператор и пост-унарный оператор.
- (оператор смены знака)
Собственно это всё что он делает - меняет знак переданного аргумента. Ещё есть побочный эффект от применения этого оператора, это повышение типа до int, в случае если аргумент имеет тип byte, short или char.
! - оператор логической инверсии. Применяется только к переменным типа boolean и превращает значение из true в false и наоборот.
Операторы инкремента (++) и декремента (--) применяются к целочисленным переменным и обладают двумя вариациям:
пост-инкремент/декремент (i++ и i--)
пре-инкремент/декремент (++i и --i)
Разница между вариациями в том, что ++i увеличивает переменную и возвращает новое значение, а i++ возвращает старое значение, а только затем увеличивает переменную.
Что же делает унарный + ? Да ничего не делает, только имеет такой же побочный эффект как и унарный -.
🔥7
Какой будет результат выполнения кода на картинке выше?
Anonymous Quiz
29%
x=5 y=9
29%
x=4 y=9
24%
x=4 y=10
18%
Ошибка компиляции
🤩7👍2