Spring Null Safety con JSpecify
Spring 7 adotta le annotazioni JSpecify, rendendo non-null il default e riducendo il rumore delle annotazioni.
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
public class UserService {
@Nullable
public User findById(@NonNull String id) {
return repository.findById(id).orElse(null);
}
@NonNull
public List<User> findAll() {
return repository.findAll();
}
@NonNull
public User save(@NonNull User user) {
return repository.save(user);
}
}
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
@NullMarked
public class UserService {
public @Nullable User findById(String id) {
return repository.findById(id).orElse(null);
}
public List<User> findAll() {
return repository.findAll();
}
public User save(User user) {
return repository.save(user);
}
}
Non-null per default
@NullMarked rende tutti i tipi non annotati non-null, così solo le eccezioni nullable necessitano di annotazione.
Standard dell'ecosistema
Le annotazioni JSpecify sono uno standard cross-framework riconosciuto da NullAway, Error Prone e IDE.
Strumenti più ricchi
I moderni analizzatori statici comprendono il modello null di JSpecify e segnalano le violazioni in fase di compilazione.
Disponibile da Spring Framework 7.0 (richiede Java 17+)
Spring 5 e 6 hanno introdotto le proprie annotazioni di null safety nel package `org.springframework.lang`. Sebbene utili, erano specifiche del framework e richiedevano l'annotazione esplicita di ogni elemento non-null. Spring 7 migra a JSpecify, uno standard cross-ecosistema per la null safety. L'annotazione `@NullMarked` a livello di classe o package dichiara che tutti i tipi non annotati sono non-null per default. Solo i tipi effettivamente nullable necessitano dell'annotazione `@Nullable`, riducendo drasticamente la verbosità. Le annotazioni JSpecify sono riconosciute dai principali strumenti di analisi statica come NullAway, Error Prone e IntelliJ IDEA.