2016-04-05 10 views
3

Gibt es eine vorhandene Hilfsmethode in Java 8-Standardbibliothek oder in Guava, die sicherstellt, dass die Auflistung nicht null ist und jedes Element (falls vorhanden) nicht null ist?Vorhandene Hilfsmethode, um sicherzustellen, dass alle Auflistungselemente nicht null sind

Wie eine "Collection-Version" von Objects.requireNonNull().

Ich konnte so etwas bisher nicht finden. Denn jetzt habe ich eine triviale Nutzenfunktion, die die Arbeit erledigt:

public static void requireAllNonNull(final Collection<?> collection) { 
    Objects.requireNonNull(collection, "Collection must not be null"); 
    if (collection.stream().anyMatch(Objects::isNull)) { 
     throw new NullPointerException("Collection elements must not be null"); 
    } 
} 

Aber das Problem ist, dass es in verschiedenen (nicht verwandten) Projekten dupliziert werden muss.

Eine Alternative wäre, nur Guava's immutable collections zu verwenden, die null Werte überhaupt nicht zulassen, aber manchmal Sammlungen stammen aus anderen Quellen.

+0

ganz gut ist, und es gibt nichts eingebaut. – Tunaki

+1

Eine Option besteht darin, Nullwerte in Iterationen und Streams aus der Sammlung zu filtern und zu ignorieren. Wenn Sie stattdessen nach vorne schauen, bevor Sie die Werte verwenden, und anderer Code Zugriff auf die Sammlung hat, kann sich der Inhalt zwischen Ihrer Überprüfung und späteren Verwendung ändern. –

+1

'if (collection.contains (null)) ...' – Holger

Antwort

3

Wenn Sie nur für ein NPE suchen geworfen werden, wäre der einfachste Ansatz könnte versuchen, einfach zu erstellen Guava ImmutableCollection, die alle Elemente erfordern als nicht-null (zB ImmutableList):

ImmutableList.copyOf(collection); 

Soweit für null Elemente überprüft, Guava hat:

boolean allNonNull = Iterables.all(collection, Predicates.notNull()); 
checkArgument(allNonNull, "collection had null element"); 

Aber wegen Time-of-Check/Time-of-Use-Schwachstellen, sind Sie in der Regel am besten zuerst auf eine unveränderliche Sammlung kopieren jedenfalls . Wenn Sie Ihre Invarianten überprüfen, indem Sie eine veränderbare Auflistung durchlaufen, gibt es immer die Möglichkeit, dass jemand die Sammlung nach ändert, die Sie validieren.

ImmutableList#copyOf hat auch die zusätzliche Leistungsüberlegung, dass, wenn es bereits eine ImmutableList ist, die zurückgegeben wird, es nur diese Liste zurückgibt, um alle Overhead zu beseitigen.

+0

Ich würde hinzufügen, dass 'ImmutableList' aus Guava ist. – Tunaki

+0

Danke @ Tanuki, das habe ich in der Antwort geklärt. –

+1

Das Zuweisen des Parameters zu einer lokalen Variablen und dann das Verwenden der lokalen Variablen scheint mir eine gute Lösung zu sein. So: 'final Liste theParam = UnveränderlicheListe.copyOf (param);' Es ist immer noch lesbar, erzeugt keine 'CheckReturnValue'-Warnungen. Und es ist "O (1)", falls "param" bereits eine "ImmutableList" war. Danke vielmals. –

3

Wenn so etwas Objects.requireNonNull, was Sie wollen, ist man einfach das tun kann:

Ihr Code
myCollection.forEach(Objects::requireNonNull); 
Verwandte Themen