Proljetne null-sigurnosne bilješke
1. Pregled
Počevši od Proljeća 5, sada imamo pristup zanimljivoj značajci koja nam pomaže pri pisanju sigurnijeg koda. Ova se značajka naziva null-security, skupina bilješki koja djeluje poput zaštite koja pazi na potencijalne null reference.
Umjesto da nas pusti da pobjegnemo s nesigurnim kodom, značajka nul-sigurnosti daje upozorenja u vrijeme sastavljanja. Takva upozorenja mogu spriječiti katastrofalne iznimke null pokazivača (NPE) tijekom izvođenja.
2. The @NonNull Bilješka
The @NonNull napomena je najvažnija među svim bilješkama značajke nul-sigurnosti. Ovu bilješku t0 možemo proglasiti ne-null ograničenje bilo gdje gdje se očekuje referenca na objekt: polje, parametar metode ili povratna vrijednost metode.
Pretpostavimo da imamo razred s imenom Osoba:
javni razred Osoba {private String fullName; void setFullName (String fullName) {if (fullName! = null && fullName.isEmpty ()) {fullName = null; } this.fullName = puno ime; } // dobivač}
Ova je definicija klase valjana, ali ima nedostatak - puno ime polje može biti postavljeno na null. Ako se to dogodi, mogli bismo dobiti NPE kad radimo s puno ime.
Značajka nulske sigurnosti Spring omogućuje alatima da prijave takvu opasnost. Na primjer, ako napišemo kod u IntelliJ IDEA i ukrasimo puno ime polje s @NonNull napomena, vidjet ćemo upozorenje:

Zahvaljujući ovoj naznaci, unaprijed smo svjesni problema i u mogućnosti smo poduzeti odgovarajuće mjere kako bismo izbjegli neuspjeh u izvođenju.
3. The @NonNullFields Bilješka
The @NonNull napomena je korisna u jamčenju ništetne sigurnosti. Međutim, zagađivali bismo cijelu bazu koda ako ovom bilješkom ukrasimo sva ne-null polja.
Možemo izbjeći zlouporabu @NonNull s drugom napomenom - @NonNullFields. Ova je napomena primjenjiva na razini paketa, obavještavajući naše razvojne alate da sva polja u označenom paketu prema zadanim postavkama nisu null.
Za @NonNullFields napomena za pokretanje, moramo stvoriti datoteku s imenom package-info.java u korijenski direktorij paketa i označite paket s @NonNullFields:
@NonNullFields paket org.baeldung.nullibility;
Proglasimo još jedno svojstvo u Osoba razred, nazvan nadimak:
paket org.baeldung.nullibility; // uvoz izjava javna klasa Osoba {private String nickName; void setNickName (@Nullable String nickName) {if (nickName! = null && nickName.isEmpty ()) {nickName = null; } this.nickName = nadimak; } // ostale izjave}
Ovaj put ne uljepšavamo nadimak polje sa @NonNull ali ipak uočite slično upozorenje:

The @NonNullFields anotacija čini naš kod manje opširnim, istodobno osiguravajući istu razinu sigurnosti kao i ona @NonNull pruža.
4. The @Nullable Bilješka
The @NonNullFields napomena je općenito poželjnija od @NonNull jer pomaže u smanjenju ploče. Ponekad želimo izuzeti neka polja iz ne-null ograničenja navedenog na razini paketa.
Vratimo se na nadimak polje i ukrasite ga s @Nullable napomena:
@Nullable private String nickName;
Upozorenje koje smo vidjeli prije nestalo je sada:

U ovoj situaciji, koristili smo @Nullable napomena da nadjača semantiku @NonNullFields na polju.
5. The @NonNullApi Bilješka
The @NonNullFields napomena odnosi se samo na, kako joj samo ime govori, polja. Ako želimo imati isti utjecaj na parametre metoda i povratne vrijednosti, trebat će nam @NonNullApi.
Kao i sa @NonNullFields, moramo navesti @NonNullApi bilješka u package-info.java datoteka:
@NonNullApi paket org.baeldung.nullibility;
Definirajmo getter za nadimak polje:
paket org.baeldung.nullibility; // uvoz izjava javne klase Osoba {@Nullable private String nickName; String getNickName () {return nickName; } // ostale izjave}
Uz @NonNullApi na snazi, izdaje se upozorenje o mogućem null vrijednost koju proizvodi getNickName metoda:

Primijetite da baš kao i @NonNullFields napomena, možemo nadjačati @NonNullApi na razini metode s @Nullable bilješka.
6. Zaključak
Proljetna nulska sigurnost sjajna je značajka koja pomaže umanjiti mogućnost NPE-a. Međutim, postoje dvije važne točke kojih se moramo pripaziti tijekom upotrebe ove značajke:
- Koristi se samo u pratećem razvojnom alatu, kao što je IntelliJ IDEA
- Ne provodi null provjere tijekom izvođenja - još uvijek moramo sami napisati kôd kako bismo spriječili NPE-ove
Izvorni kod za ovu lekciju možete pronaći na GitHubu.