Null safety w Javie

1

Java nie ma żadnego null-safety, kotlin ma. -- @jarekr000000 // Dlaczego Kotlin jeszcze nie wyparł Javy?

Nawiązując do tych słów chciałem napisać podsumowanie pokazujące, że Java null safety jednak jakieś tam ma:

JSR-305 - przed kompilacją, w czasie kompilacji plus runtime (Hibernate Validator)
https://dzone.com/articles/when-to-use-jsr-305-for-nullability-in-java

Objects.requireNonNull (i pokrewne) - runtime
https://dzone.com/articles/yet-4-more-techniques-for-writing-better-java

Apache Commons StringUtils - runtime
https://www.baeldung.com/java-blank-empty-strings

Optional - runtime
https://www.oracle.com/technical-resources/articles/java/java8-optional.html

Prymitywy - compile time
https://www.baeldung.com/java-avoid-null-check

Może nie jest to tak eleganckie jak w Kotlinie, ale jednak jest i trzeba tego używać siedząc w tym pięknym inaczej języku.

Znacie jeszcze jakieś inne patenty w Javie?

5

@vpiotr: no niestety to żadne null-safety. Nawet Optionala możesz zwracać jako null, null-safety pilnuje Cię na etapie kompilacji, a Object.requireNonNull to wyjątek na twarz i YOLO. Średnie rozwiązanie.

5

@vpiotr:
Do takiej obszernej listy null-safety w javie to brakuje jeszcze tylko najlepszego patentu na null safety ever:

if (x == null) {
    return null;
}

Tym niemniej, nie napisałem compile time null-safety. Przyjąłem, że to jest domyślne.

1

W tym artykule nie ma nic o kolekcjach, o ile mnie pamięć nie myli to da się dać adnotacje na argument generyczny kolekcji:

final List<@Nonnull String> lista = new ArrayList<>();

Ale czy to będzie potem respektowane przez np. FindBug'sa? Może ktoś potwierdzić?

2

Patenty z optionalem, itp. są fajne i dużo dają, ale nie jest to null-safety, bo jak ktoś gdziekolwiek rzuci nulla i nie zrobimy w porę null-checka, to optional się może wysypać, a taki null może przyjść z third-party biblioteki. Niekoniecznie z naszego kodu. Mimo wszystko, uważam, że warto stosować Optionale.

Ciekawy patent na nulle w javie, to ten plugin do Gradle'a: https://github.com/uber/NullAway . Build nam się wysypie na etapie kompilacji, jak w projekcie jest potencjalny NPE. Użyłem tego w jednym swoim side-projekcie i rzeczywiście to działa, choć może to spowolnić development, ale z zyskiem dla jakości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1