Не використовуйте null, використовуйте Необов’язково
Як ви вже зазначали, одна з найбільших проблем null
у Java полягає в тому, що її можна використовувати скрізь або принаймні для всіх типів посилань.
Неможливо сказати, що може бути, null
а що не може бути.
Java 8 надає набагато краще картина: Optional
.
І приклад від Oracle:
String version = "UNKNOWN";
if(computer != null) {
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null) {
USB usb = soundcard.getUSB();
if(usb != null) {
version = usb.getVersion();
}
}
}
Якщо кожен із них може повернути успішне значення або не може повернути його, ви можете змінити API на Optional
s:
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
Шляхом чіткого кодування необов'язкового типу, ваші інтерфейси стануть набагато кращими, а ваш код буде чистішим.
Якщо ви не використовуєте Java 8, ви можете подивитися com.google.common.base.Optional
в Google Guava.
Гарне пояснення команди Guava: https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
Більш загальне пояснення недоліків до нуля, із прикладами з декількох мов: https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/
@Nonnull, @Nullable
Java 8 додає ці примітки, щоб допомогти інструментам перевірки коду, таким як проблеми з виявленням IDE. Вони досить обмежені у своїй ефективності.
Перевірте, коли це має сенс
Не пишіть 50% перевірки коду на нуль, особливо якщо немає нічого розумного, що ваш код може мати null
значення.
З іншого боку, якщо це null
можна було б використати і щось означати, то обов'язково його використовуйте.
Зрештою, ви, очевидно, не можете видалити null
з Java. Я настійно рекомендую замінити Optional
абстракцію, коли це можливо, і перевірити null
ті інші часи, що ви можете зробити щось розумне в цьому.