Nie używaj null, użyj Opcjonalnie
Jak wskazałeś, jednym z największych problemów null
w Javie jest to, że można jej używać wszędzie , a przynajmniej we wszystkich typach referencyjnych.
Nie można powiedzieć, że to może być, null
a co nie może być.
Java 8 wprowadza wiele lepiej kierunkowa: Optional
.
I przykład z Oracle:
String version = "UNKNOWN";
if(computer != null) {
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null) {
USB usb = soundcard.getUSB();
if(usb != null) {
version = usb.getVersion();
}
}
}
Jeśli każdy z nich może, ale nie musi, zwrócić wartość udaną, możesz zmienić interfejsy API na Optional
s:
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
Dzięki jawnemu kodowaniu opcjonalności w typie interfejsy będą znacznie lepsze, a kod będzie czystszy.
Jeśli nie używasz Java 8, możesz zajrzeć na com.google.common.base.Optional
Google Guava.
Dobre wyjaśnienie zespołu Guava: https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
Bardziej ogólne objaśnienie wad do zera, z przykładami z kilku języków: https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/
@Nonnull, @Nullable
Java 8 dodaje te adnotacje, aby pomóc narzędziom do sprawdzania kodu, takim jak IDE, wykrywać problemy. Ich skuteczność jest dość ograniczona.
Sprawdź, kiedy ma to sens
Nie pisz 50% kodu sprawdzającego wartość null, szczególnie jeśli nie ma nic sensownego, by twój kod mógł zrobić z null
wartością.
Z drugiej strony, jeśli null
można go użyć i coś znaczyć, należy go użyć.
Ostatecznie nie można oczywiście usunąć null
z Javy. Zdecydowanie zalecam zastępowanie Optional
abstrakcji, gdy tylko jest to możliwe, i sprawdzanie, null
kiedy można zrobić z tym coś rozsądnego.