1. Общ преглед
Започвайки с Spring 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, когато работим с fullName .
Функцията Spring null-безопасност позволява на инструментите да докладват за такава опасност. Например, ако напишем код в IntelliJ IDEA и декорираме полето fullName с анотацията @NonNull , ще видим предупреждение:

Благодарение на тази индикация, ние сме наясно с проблема предварително и сме в състояние да предприемем подходящи действия, за да избегнем неуспех по време на изпълнение.
3. Анотацията @NonNullFields
В @NonNull анотацията е полезна за гарантиране нулев безопасност. Ние обаче бихме замърсили цялата база на кода, ако украсихме всички ненулеви полета с тази анотация.
Можем да избегнем злоупотребата с @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, но все пак виждаме подобно предупреждение:

В @NonNullFields анотацията прави нашия код по-малко многословно като същевременно се гарантира същото ниво на безопасност, което @NonNull осигурява.
4. Анотация @Nullable
В @NonNullFields анотация обикновено е за предпочитане да се @NonNull , тъй като спомага за намаляване на шаблон. Понякога искаме да освободим някои полета от ненулевото ограничение, посочено на ниво пакет.
Да се върнем към полето nickName в и да го украсим с @Nullable анотация:
@Nullable private String nickName;
Предупреждението, което видяхме преди, вече го няма:

В тази ситуация използвахме анотацията @Nullable, за да заменим семантиката на @NonNullFields в поле.
5. Анотацията @NonNullApi
В @NonNullFields анотацията се отнася само до, както подсказва името му, области. Ако искаме да имаме същото въздействие върху параметрите на методите и възвръщаемите стойности, ще ни трябва @NonNullApi .
Както и при @NonNullFields , ние трябва да се уточни @NonNullApi анотация в package-info.java файл:
@NonNullApi package org.baeldung.nullibility;
Нека дефинираме гетер за полето nickName :
package org.baeldung.nullibility; // import statements public class Person { @Nullable private String nickName; String getNickName() { return nickName; } // other declarations }
С действащата анотация @NonNullApi се издава предупреждение за възможна нулева стойност, получена от метода getNickName :

Забележете, че точно както анотацията @NonNullFields , можем да заменим @NonNullApi на ниво метод с анотацията @Nullable .
6. Заключение
Пролетната нулева безопасност е чудесна функция, която помага да се намали възможността за NPE. Има обаче две важни точки, от които трябва да се пазим, докато използваме тази функция:
- Може да се използва само в помощен инструмент за разработка, като IntelliJ IDEA
- Той не налага нулеви проверки по време на изпълнение - все още трябва да напишем код сами, за да предотвратим NPE
Изходният код за този урок може да бъде намерен в GitHub.