Spring Null-Safety-aantekeningen

1. Overzicht

Vanaf lente 5 hebben we nu toegang tot een interessante functie die ons helpt om veiligere code te schrijven. Deze functie wordt null-safety genoemd, een groep annotaties die werkt als een beveiliging die uitkijkt naar mogelijke null-verwijzingen.

In plaats van ons weg te laten komen met onveilige code, de null-veiligheidsfunctie produceert waarschuwingen tijdens het compileren. Dergelijke waarschuwingen kunnen catastrofale null-pointeruitzonderingen (NPE's) tijdens runtime voorkomen.

2. Het @RTLnieuws Annotatie

De @RTLnieuws annotatie is de belangrijkste van alle annotaties van de null-veiligheidsfunctie. We kunnen deze annotatie gebruiken om een ​​non-null-beperking te declareren overal waar een objectverwijzing wordt verwacht: een veld, een methodeparameter of de retourwaarde van een methode.

Stel dat we een klasse hebben met de naam Persoon:

openbare klasse Persoon {privé String fullName; void setFullName (String fullName) {if (fullName! = null && fullName.isEmpty ()) {fullName = null; } this.fullName = fullName; } // getter}

Deze klassendefinitie is geldig, maar heeft een defect: de voor-en achternaam veld kan zijn ingesteld op nul. Als dit gebeurt, kunnen we bij het werken met een NPE terechtkomen voor-en achternaam.

Met de Spring-nulbeveiligingsfunctie kunnen tools een dergelijk gevaar melden. Als we bijvoorbeeld code schrijven in IntelliJ IDEA en de voor-en achternaam veld met de @RTLnieuws annotatie, we zien een waarschuwing:

Dankzij deze indicatie zijn we van tevoren op de hoogte van het probleem en kunnen we passende maatregelen nemen om een ​​runtime-storing te voorkomen.

3. Het @RTLnieuws Annotatie

De @RTLnieuws annotatie is nuttig om null-veiligheid te garanderen. We zouden echter de hele codebasis vervuilen als we alle niet-null-velden met deze annotatie zouden versieren.

We kunnen misbruik van @RTLnieuws met een andere annotatie - @RTLnieuws. Deze annotatie is van toepassing op pakketniveau en geeft aan onze ontwikkeltools aan dat alle velden in het geannoteerde pakket standaard niet nul zijn.

Voor de @RTLnieuws annotatie om in te trappen, moeten we een bestand maken met de naam package-info.java in de hoofdmap van het pakket en annoteer het pakket met @RTLnieuws:

@NonNullFields pakket org.baeldung.nullibility;

Laten we een andere eigenschap aangeven in de Persoon klasse, genaamd bijnaam:

pakket org.baeldung.nullibility; // importeer statements public class Person {private String nickname; void setNickName (@Nullable String nickname) {if (nickname! = null && nickname.isEmpty ()) {nickname = null; } this.nickName = nickname; } // andere verklaringen}

Deze keer verfraaien we de bijnaam veld met @RTLnieuws maar zie nog steeds een soortgelijk voorbehoud:

De @RTLnieuws annotatie maakt onze code minder uitgebreid en zorgt tegelijkertijd voor hetzelfde veiligheidsniveau @RTLnieuws biedt.

4. Het @Nullable Annotatie

De @RTLnieuws annotatie verdient over het algemeen de voorkeur boven @RTLnieuws omdat het helpt om de boilerplate te verminderen. Soms willen we sommige velden vrijstellen van de niet-null-beperking die op pakketniveau is gespecificeerd.

Laten we teruggaan naar de bijnaam veld erin en versier het met de @Nullable annotatie:

@Nullable private String nickname;

De waarschuwing die we eerder zagen, is nu verdwenen:

In deze situatie, we gebruikten de @Nullable annotatie om de semantiek van @RTLnieuws op een veld.

5. Het @RTLnieuws Annotatie

De @RTLnieuws annotatie is alleen van toepassing op, zoals de naam suggereert, velden. Als we dezelfde impact willen hebben op de parameters en retourwaarden van de methoden, hebben we nodig @RTLnieuws.

Net als bij @RTLnieuws, we moeten de @RTLnieuws annotatie in het package-info.java het dossier:

@NonNullApi pakket org.baeldung.nullibility;

Laten we een getter definiëren voor de bijnaam veld:

pakket org.baeldung.nullibility; // importeer statements public class Person {@Nullable private String nickname; String getNickName () {return nickname; } // andere verklaringen}

Met de @RTLnieuws annotatie van kracht, wordt een waarschuwing gegeven over een mogelijk nul waarde geproduceerd door de getNickName methode:

Merk op dat net als de @RTLnieuws annotatie, kunnen we de @RTLnieuws op het method-niveau met de @Nullable annotatie.

6. Conclusie

Nul-veiligheid in de lente is een geweldige functie die de mogelijkheid van NPE's helpt verminderen. Er zijn echter twee belangrijke punten waar we op moeten letten bij het gebruik van deze functie:

  • Het is alleen bruikbaar in een ondersteunende ontwikkelingstool, zoals IntelliJ IDEA
  • Het dwingt niet af nul controles tijdens runtime - we moeten nog steeds zelf code schrijven om NPE's te voorkomen

De broncode voor deze tutorial is te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found