2016-05-11 9 views
-1

Ich bin auf einem Android-Projekt arbeiten, die eine Menge von seltsamen null verwendet in Java überprüft, was zu einer Codezeilen wie folgt aus:Zugang null Feld Java-Objekt ohne NPE

if (foo == null || foo.bar == null || foo.bar.foobar == null) { 
    return; 
} 

Ich versuche zu reinigen es bis die Utility-Klasse

public class Utility { 
    public static boolean allNotNull(Object... objects) { 
     for (Object object : objects) { 
      if (objectIsNull(object)) { return false; } 
     } 
     return true; 
    } 

    public static boolean anyAreNull(Object... objects) { 
     return !allNotNull(objects); 
    } 

    private static boolean objectIsNull(Object object) { 
     try { 
      return object == null; 
     } catch (NullPointerException e) { 
      return true; 
     } 
    } 
} 

mit dieser Klasse verwenden, würde Ich mag den Code

if (Utility.areAnyNull(foo.bar.foobar)) { 
    return; 
} 

U vereinfachen Leider stürzt dies vor dem Eingeben der areAnyNull-Funktion ab, wenn A null ist. Gibt es eine Möglichkeit zu verhindern, dass die Funktion abstürzt, ohne eine try catch-Anweisung um jedes meiner if (Utility ...) -Aufrufe einzubinden? Oder gibt es einen besseren Weg, um meine if-Anweisungen zu bereinigen und zu überprüfen, ob etwas null ist?

+1

Von Ihrem 'java-7' Tag gehe ich davon aus Java 8 ist keine Option? – shmosel

+0

Ja, mit Android. Ich könnte die rückportierten Java 8-Optionen verwenden, aber sie machen den Code nicht leichter lesbar. – communistWatermelon

+0

Wenn Groovy eine Option für Sie ist, haben sie einen Null-sicheren Operator: 'foo? .bar? .foobar'. – chrylis

Antwort

0

Es gibt keinen nativen syntaktischen Weg, um das in Java zu tun. Aber wenn Sie Java 8 können Sie Optional verwenden, um etwas ähnliches zu tun:

boolean areAnyNull = !Optional.of(foo) 
     .map(foo -> foo.bar) 
     .map(bar -> bar.foobar) 
     .isPresent(); 
+1

Ich benutze Java 7 (es ist ein Android-Projekt), und das macht den Code schwerer lesbar und scheint keine zusätzlichen Vorteile hinzuzufügen. Ich versuche im Grunde, die 'if let'-Syntax von Swift so genau wie möglich in Java zu erreichen, indem ich die Funktion verlasse, wenn die Werte null sind, und sie sonst Variablen zuweise. – communistWatermelon

+0

@communistWatermelon, 'Optional' bietet neben' ifPresent() 'weitere Dienstprogramme. Das war nur die nächste Antwort auf deine spezifische Frage. – shmosel

+0

Es zwingt den Benutzer definitiv zu denken und explizit Null Sicherheit hinzufügen, aber Java-Implementierung tut nichts, um den Benutzer die Verwendung von Nicht-Null-Wert zu helfen. 'ifPresent()' ist im Grunde genommen nur 'if (! = null)', 'oder()' ist nur 'if (== null) {doThing; } '. Die Kartenfunktionen sind nett, aber in diesem Fall nicht wirklich anwendbar. Java-Optionen scheinen nicht so nützlich zu sein wie die Implementierungen von Kotlin/Swift/Groovey, IMO. – communistWatermelon