Автор оригинала: Nguyen Nam Thai.
1. Обзор
Начиная с весны 5, у нас теперь есть доступ к интересной функции, помогающей нам писать более безопасный код. Эта функция называется нулевой безопасностью, группой аннотаций, работающих как защита, которая следит за потенциальными нулевыми ссылками.
Вместо того, чтобы позволить нам уйти с небезопасным кодом, функция нулевой безопасности выдает предупреждения во время компиляции. Такие предупреждения могут предотвратить катастрофические исключения нулевых указателей (NPE) во время выполнения.
2. Аннотация @NonNull
Аннотация @NonNull является наиболее важной среди всех аннотаций функции нулевой безопасности. Мы можем использовать эту аннотацию t0 объявить ненулевое ограничение в любом месте, где ожидается ссылка на объект: поле, параметр метода или возвращаемое значение метода.
Предположим, у нас есть класс с именем Person :
public class Person { private String fullName; void setFullName(String fullName) { if (fullName != null && fullName.isEmpty()) { fullName = null; } this.fullName = fullName; } // getter }
Это определение класса допустимо, но имеет дефект – поле FullName может быть установлено в null . Если это произойдет, мы можем получить NPE при работе с полное имя .
Функция нулевой безопасности пружины позволяет инструментам сообщать о такой опасности. Например, если мы напишем код в IntelliJ IDEA и украсим поле полное имя аннотацией @NonNull , мы увидим предупреждение:
Благодаря этому показанию мы заранее знаем о проблеме и можем предпринять соответствующие действия, чтобы избежать сбоя во время выполнения.
3. Аннотация @Notnullfields
Аннотация @NonNull полезна для обеспечения безопасности null. Однако мы бы загрязнили всю базу кода, если бы украсили все ненулевые поля этой аннотацией.
Мы можем избежать злоупотребления @NonNull с помощью другой аннотации – @NonNullFields . Эта аннотация применима на уровне пакета, уведомляя наши инструменты разработки о том, что все поля в аннотированном пакете по умолчанию не являются нулевыми.
Чтобы аннотация @NonNullFields заработала, нам нужно создать файл с именем package-info.java в корневом каталоге пакета и аннотируйте пакет с помощью @NonNullFields :
@NonNullFields package org.baeldung.nullibility;
Давайте объявим другое свойство в классе Person , называемое nickName :
package org.baeldung.nullibility; // import statements public class Person { private String nickName; void setNickName(@Nullable String nickName) { if (nickName != null && nickName.isEmpty()) { nickName = null; } this.nickName = nickName; } // other declarations }
На этот раз мы не украшаем поле nickName с помощью @NonNull , но все равно видим аналогичную оговорку:
Аннотация @Notnullfields делает наш код менее подробным, обеспечивая тот же уровень безопасности, что и @NonNull .
4. Аннотация @Nullable
Аннотация @NonNullFields обычно предпочтительнее, чем @NonNull , поскольку она помогает уменьшить шаблонность. Иногда мы хотим освободить некоторые поля от ненулевого ограничения, указанного на уровне пакета.
Давайте вернемся к полю Ник и украсим его аннотацией @Nullable :
@Nullable private String nickName;
Предупреждение, которое мы видели раньше, теперь исчезло:
В этой ситуации мы использовали аннотацию @Nullable для переопределения семантики @Notnullfields в поле.
5. Аннотация @NonNullApi
Аннотация @Notnullfields применяется только к полям, как следует из ее названия. Если мы хотим иметь такое же влияние на параметры методов и возвращаемые значения, нам понадобится @NonNullApi .
Как и в случае с @NonNullFields , мы должны указать аннотацию @NonNullApi в package-info.java файл:
@NonNullApi package org.baeldung.nullibility;
Давайте определим геттер для поля Ник :
package org.baeldung.nullibility; // import statements public class Person { @Nullable private String nickName; String getNickName() { return nickName; } // other declarations }
При действии аннотации @Nonnull выдается предупреждение о возможном null значении, полученном методом getNickName :
Обратите внимание, что, как и в аннотации @Notnullfields , мы можем переопределить @NonNullApi на уровне метода с помощью аннотации @Nullable .
6. Заключение
Пружинная нулевая безопасность-отличная функция, которая помогает уменьшить вероятность NPE. Однако есть два важных момента, которых мы должны остерегаться при использовании этой функции:
- Его можно использовать только в вспомогательном инструменте разработки, таком как IntelliJ IDEA
- Он не применяет проверки null во время выполнения – нам все равно нужно самим писать код, чтобы предотвратить NPE
Исходный код этого учебника можно найти на GitHub .