Wie überprüft man mehrere Objekte auf Nichtigkeit?
Oft, ich kann sehen, einen code-Konstrukte wie folgende:
if(a == null || b == null || c == null){
//...
}
Frage ich mich, ob es irgendeine weit verbreitete Bibliothek (Google, Apache, etc.) um zu überprüfen, gegen die Nichtigkeit für mehrere Objekte auf einmal, z.B.:
if(anyIsNull(a, b, c)){
//...
}
oder
if(allAreNulls(a, b, c)){
//...
}
UPDATE:
- Ich perfekt wissen, wie Sie schreiben, ihn von mir
- Ich weiß, es kann das Ergebnis von der schlechten Struktur des Programms, aber es ist nicht Fall hier
- Let ' s machen es schwieriger und original ersetzen z.B. mit sowas:
if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){ //... }
UPDATE 2:
Habe ich einen pull-request für Apache-Commons-Lang-library zu beheben, diese Lücke:
- Problem: https://issues.apache.org/jira/browse/LANG-781
- PR: https://github.com/apache/commons-lang/pull/108
Diese integriert werden in commons-lang-version 3.5:
anyNotNull (Object... values)
allNotNull (Object... values)
InformationsquelleAutor der Frage Krzysztof Wolny | 2015-07-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
BEARBEITEN 2018: Als der Apache Commons lang, 3.5, es hat
ObjectUtils.allNotNull()
undObjectUtils.anyNotNull()
.Nicht.
Keiner von Apache Commons Lang (3.4)Google Guava (18) und Frühling (4.1.7) bieten so eine utility-Methode.
Müssen Sie schreiben Sie es auf Ihre eigenen, wenn Sie wirklich, wirklich brauchen es. In modernen Java-code, würde ich wohl überlegen müssen, für solch ein Konstrukt, ein code, der Geruch, obwohl.
InformationsquelleAutor der Antwort Petr Janeček
In Java 8, die Sie nutzen könnten
Stream.allMatch
um zu überprüfen, ob alle Werte entsprechen einem bestimmten Zustand, wie z.B.null
. Nicht viel kürzer, aber vielleicht ein bisschen leichter zu Lesen.Und analogeously für
anyMatch
undnoneMatch
.Über Ihre "mehr herausfordernden Beispiel": In diesem Fall denke ich, es gibt keine Möglichkeit, um das schreiben einer lazy-ausgewertet Verbindung von null-Prüfungen, wie die, die Sie haben:
Einer der anderen Ansätze, streams, Listen, oder var-arg-Methoden, die versuchen würde, zu bewerten
a.getFoo()
vora
getestet wurde nichtnull
. Könnten SieOptional
mitmap
und Methode, die Zeiger, das wird träge ausgewertet, eine nach der anderen, aber ob dieses macht es nicht mehr lesbar ist umstritten und variieren von Fall zu Fall (besonders für längere Klassennamen):Andere alternative könnte sein, die
try
Zugriff auf das innerste Element, aber ich habe das Gefühl, dass dies wird nicht als gute Praxis, entweder:Besonders, das wird auch fangen andere NPEs nach Zugriff auf das element -- entweder das, oder Sie haben Sie nur die
Bar bar = ...
imtry
und alles andere in einem anderenif
block nach dertry
zunichte irgendwelche (fragwürdigen) gewinnt an Lesbarkeit oder Kürze.(Ich erinnere mich vage etwas über eine notation wie
a?.getFoo()?.getBar() != null
aber ich kann mich nicht erinnern, ob es ein feature-request für Java oder eine ganz andere Sprache.)InformationsquelleAutor der Antwort tobias_k
Könnte man auch so etwas wie die folgende Methode. Es ermöglicht Ihnen, übergeben Sie so viele Parameter wie Sie wollen:
Rufen Sie es mit so viele Parameter wie Sie möchten:
Könnten Sie tun, etwas ähnliches für
areAllNull
.Hinweis: Sie könnten auch den ternären operator statt
if (o == null)
. Die beiden Methoden, die hier gezeigt haben, keine Fehlerbehandlung. Angepasst an Ihre Bedürfnisse.InformationsquelleAutor der Antwort kamwo
Ist es möglich, mit Hilfe von Objekten der Klasse
InformationsquelleAutor der Antwort viavad
Erstellen Sie eine Liste der Sie Objekte und verwenden Sie
yourList.contains(null)
.DEMO
InformationsquelleAutor der Antwort singhakash