Dobre praktyki programistyczne

Iterowanie tylko po wartościach różnych od null

27.10.2011

Od Javy 5 istnieje w tym języku instrukcja „foreach”. Ale jeśli kolekcja zawiera wartości null, to iterator także zwróci null. Jeśli kod nie sprawdza czy bieżący element jest równy null, to zostanie zwrócony wyjątek NullPointerException. Stworzyłem więc prostą klasę bazującą na wzorcu projektowym Dekorator. Po prostu owija ona obiekt Iterable lub Iterator i zwraca tylko wartości różne od null.

  1. public static void main(String[] args) {
  2. //a collection which contains null
  3. List<String> list = Arrays.asList(new String[]{"a", "b", null, "d"});
  4. System.out.println("NonNullIterable");
  5. for (String s : new NonNullIterable<>(list)) {
  6. System.out.print(s.toUpperCase());//this will print "ABC"
  7. }
  8. System.out.println("\nNormal Iterable");
  9. for (String s : list) {
  10. try {
  11. System.out.print(s.toUpperCase());
  12. } catch (NullPointerException e) {
  13. System.out.println("\nNullPointerException have been thrown");
  14. }
  15. }
  16. }

Poniżej jest wyjście powyższego programu:
  1. NonNullIterable
  2. ABD
  3. Normal Iterable
  4. AB
  5. NullPointerException have been thrown
  6. D

Ta klasa może być użyta jak powyżej lub też z użyciem innych pętli (np. while). Dzięki temu kod jest bezpieczniejszy i bardziej czytelny, jeśli nie dbasz o wartości null.

Możesz zobaczyć kod źródłowy NonNullIterable wraz z testem JUnit4 na GitHub. Klasa nie ma zależności, z wyjątkiem adnotacji FindBugs, które mogą być pomocne, jeśli analizujesz swój program przy użyciu tego narzędzia.

Leave a Response