أمان null في Spring مع JSpecify
يعتمد Spring 7 تعليقات JSpecify مما يجعل non-null القيمة الافتراضية ويقلل الضجيج التعليقي.
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 بشكل افتراضي
@NullMarked يجعل جميع الأنواع غير المُعلَّقة non-null فلا تحتاج التعليق إلا الاستثناءات الفارغة.
معيار النظام البيئي
تعليقات JSpecify هي معيار عابر للأطر مُعترَف به من NullAway و Error Prone والـ IDEs.
أدوات أغنى
المحللات الثابتة الحديثة تفهم نموذج null في JSpecify وتُبلّغ عن الانتهاكات وقت الترجمة.
متاح منذ Spring Framework 7.0 (يتطلب Java 17+)
قدّم Spring 5 و6 تعليقات أمان null الخاصة به في حزمة org.springframework.lang. بينما كانت مفيدة كانت خاصة بالإطار وتتطلب تعليق كل عنصر non-null صراحةً. ينتقل Spring 7 إلى JSpecify وهو معيار عابر للنظام البيئي لأمان null. يُصرّح التعليق @NullMarked على مستوى الفئة أو الحزمة بأن جميع الأنواع غير المُعلَّقة non-null بشكل افتراضي. الأنواع الفارغة الفعلية فحسب هي التي تحتاج تعليق @Nullable مما يقلل التعليق بشكل كبير.