Jaki jest najlepszy sposób ochrony przed zerami w pętli for w Javie?
To wydaje się brzydkie:
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
Lub
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
Inaczej może nie być. Czy powinni umieścić go w for
samej konstrukcji, jeśli jest zerowy, to nie uruchamiaj pętli?
null
to nie to samo, co pusta kolekcja.Odpowiedzi:
Powinieneś lepiej sprawdzić, skąd masz tę listę.
Potrzebujesz tylko pustej listy, ponieważ pusta lista nie zawiedzie.
Jeśli otrzymasz tę listę z innego miejsca i nie wiesz, czy jest w porządku, czy nie, możesz utworzyć metodę narzędziową i użyć jej w następujący sposób:
I oczywiście
safe
byłoby:źródło
emptyList
java.sun.com/j2se/1.5.0/docs/api/java/util/ ... Co to jest IIRC?Możesz potencjalnie napisać metodę pomocniczą, która zwróci pustą sekwencję, jeśli przekażesz wartość null:
Następnie użyj:
Chociaż nie sądzę, żebym to zrobił - zwykle używałbym twojej drugiej formy. W szczególności ważne jest „or throw ex” - jeśli naprawdę nie powinno być null, zdecydowanie powinieneś zgłosić wyjątek. Wiesz, że coś poszło nie tak, ale nie znasz rozmiaru szkód. Przerwij wcześniej.
źródło
emptyIfNull
toIterable<T>
- jestremove
włączona niefortunna metodaIterator<T>
, ale to jedyny jej zmienny aspekt (a jeśli masz pustą kolekcję, dlaczego próbujesz cokolwiek z niej usunąć?) Nie jest jasne, co robisz. sprzeciwiam się tutaj.Jest już 2017 rok i możesz teraz korzystać z Apache Commons Collections4
Użycie:
Możesz wykonać to samo sprawdzanie bezpieczeństwa null dla innych klas kolekcji za pomocą
CollectionUtils.emptyIfNull
.źródło
Collections.emptyList()
wewnętrznie, co z kolei zawsze zwraca tę samą wstępnie przydzieloną pustą listę niemodyfikowalną.W Javie 8
Optional
:źródło
someList != null ? someList : Collections.emptyList()
a także tworzy i natychmiast odrzuca instancjęOptional
obiektu.Użyj
ArrayUtils.nullToEmpty
zcommons-lang
biblioteki dla tablicTa funkcjonalność istnieje w
commons-lang
bibliotece, która jest zawarta w większości projektów Java.To jest to samo, co odpowiedź udzielona przez @OscarRyz, ale ze względu na mantrę DRY uważam, że warto o tym wspomnieć. Zobacz stronę projektu Common-Lang . Oto dokumentacja i źródło
nullToEmpty
APIMaven należy dołączyć do
commons-lang
projektu, jeśli jeszcze nie jest.Niestety,
commons-lang
nie zapewnia tej funkcji dlaList
typów. W takim przypadku musisz użyć metody pomocniczej, jak wspomniano wcześniej.źródło
Jeśli otrzymujesz to
List
z wywołania metody, którą implementujesz, nie zwracajnull
, zwróć pustyList
.Jeśli nie możesz zmienić implementacji, utkniesz z
null
czekiem. Jeśli tak nie jestnull
, zgłoś wyjątek.Nie wybrałbym metody pomocniczej, która zwraca pustą listę, ponieważ czasami może się przydać, ale wtedy przyzwyczaiłbyś się do wywoływania jej w każdej pętli, którą wykonujesz, prawdopodobnie ukrywając niektóre błędy.
źródło
Zmodyfikowałem powyższą odpowiedź, więc nie musisz rzucać z Object
a następnie po prostu zadzwoń do listy według
Wyjaśnienie: MyOwnObject: Jeśli
List<Integer>
to MyOwnObject będzie w tym przypadku Integer.źródło
Innym sposobem skutecznego zabezpieczenia się przed wartością zerową w pętli for jest umieszczenie kolekcji w Google Guava,
Optional<T>
ponieważ można mieć nadzieję, że dzięki temu możliwość efektywnego opróżnienia kolekcji jest jasna, ponieważ klient powinien sprawdzić, czy kolekcja jest obecnaOptional.isPresent()
.źródło
Dla każdego, kto nie jest zainteresowany pisaniem własnej statycznej metody bezpieczeństwa zerowego, możesz użyć: commons-lang's
org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
. Na przykład:ObjectUtils.defaultIfNull JavaDoc
źródło
Use,
CollectionUtils.isEmpty(Collection coll)
metoda, która jest null-bezpiecznym sprawdzaniem, czy określona kolekcja jest pusta.za to
import org.apache.commons.collections.CollectionUtils
.Zależność Mavena
źródło
źródło