Пролетни анотации за нулева безопасност

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.