Członek zespołu Guava tutaj.
Prawdopodobnie największą wadą programu null
jest to, że nie jest oczywiste, co to powinno oznaczać w danym kontekście: nie ma ilustracyjnej nazwy. Nie zawsze jest oczywiste, że null
oznacza to „brak wartości dla tego parametru” - do cholery, jako wartość zwracana, czasami oznacza to „błąd”, a nawet „sukces” (!!), lub po prostu „prawidłowa odpowiedź to nic”. Optional
jest często pojęciem, które faktycznie masz na myśli, ustawiając zmienną dopuszczającą wartość null, ale nie zawsze. Jeśli tak nie jest, zalecamy napisanie własnej klasy, podobnej do Optional
innego schematu nazewnictwa, ale z innym schematem, aby wyjaśnić, co tak naprawdę masz na myśli.
Ale powiedziałbym, że największą zaletą Optional
nie jest czytelność: zaletą jest to, że jest odporny na idiotę. Zmusza cię do aktywnego myślenia o nieobecnym przypadku, jeśli chcesz, aby program w ogóle się kompilował, ponieważ musisz aktywnie rozpakować Optional
i zająć się tym przypadkiem. Null sprawia, że po prostu zapomnienie o rzeczach jest niepokojąco łatwe i chociaż FindBugs pomaga, nie sądzę, że rozwiązuje ten problem równie dobrze. Jest to szczególnie istotne, gdy zwracasz wartości, które mogą, ale nie muszą być „obecne”. Ty (i inni) jesteście znacznie bardziej skłonni zapomnieć, że other.method(a, b)
może zwrócić null
wartość, niż prawdopodobnie zapomnieć, że a
może to mieć miejsce null
podczas implementacji other.method
. PowracającyOptional
sprawia, że wywołujący nie mogą zapomnieć o tym przypadku, ponieważ sami muszą rozpakować obiekt.
Z tych powodów zalecamy używanie Optional
jako zwracanego typu dla metod, ale niekoniecznie w argumentach metody.
(Nawiasem mówiąc, jest to całkowicie zaczerpnięte z dyskusji tutaj ).