1

Ich habe eine einfache Methode bekommt, die nicht null in Attributen überprüft gibt es:Überprüfung für „verschachtelte“ null Attribute in Java

public boolean isValid(){ 
    return session.getX() != null && session.getX().getY() != null && 
    session.getX().getY().getZ() != null; 
} 

Dies funktioniert, aber, Gibt es eine Möglichkeit, dies in einem mehr zu tun elegante Art und Weise?

Vielen Dank im Voraus.

+1

[Vermeiden! = Null Aussagen] (http://stackoverflow.com/questions/271526/avoiding-null-statements) – Landaida

+1

es sieht aus wie codesmell und Verletzung der https://en.wikipedia.org/ wiki/Law_of_Demeter –

+0

Mögliches Duplikat von [Ketten von "Get" -Rufen auf Null prüfen] (http://stackoverflow.com/questions/3458451/check-chains-of-get-calls-for-null) – Tom

Antwort

1

Dies funktioniert, aber, gibt es eine Möglichkeit, dies auf eine elegantere Weise zu tun?

Mit einer Utility-Klasse, die Reflektion, um die verschachtelten Felder abzurufen führt und die Prüfung zu tun, es eleganter sein kann, aber es ist sicherlich weniger sicher und langsamer:

public boolean isValid(){ 
    return NullAnalyser.isNotNull(session, "x.y.z"); 
} 

Eine weitere Idee zurückkehren würde ein spezieller Typ, der es ermöglicht, NPE im Getter zu vermeiden. Aber es macht sie komplexer. Ist es wünschenswert?

+0

Danke für deine Antwort @davidxxx. Ich habe auch überlegt nachgedacht, aber ich würde gerne eine existierende Bibliothek bekommen, wenn möglich, um zu vermeiden, das Rad neu zu erfinden. –

+0

Gern geschehen. BeanUtils sollte den Job machen. Zum Beispiel 'BeanUtils.getProperty (Sitzung," xyz ");' https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html – davidxxx

1

Auf diese Weise ist elegant, wenn Sie Java verwenden 8:

public boolean isValid(){ 
    return Optional.of(session) 
        .map(x -> x.getX()) 
        .map(x -> x.getY()) 
        .map(x -> x.getZ()) 
        .isPresent()); 
} 
0

Ähnlich wie Dimitry sagte, wenn Sie mit Java 8 und haben die Kontrolle über Session, X, Y und Z, dann können Sie die Signaturen ändern Optionale zurückgeben.

Sie können auch Methodenreferenzen anstelle von Lambdas verwenden, die leichter zu lesen sind.

public boolean isValid(){ 
    return Optional.of(session) 
        .map(Session::getX) 
        .map(X::getY) 
        .map(Y::getZ) 
        .isPresent()); 
} 
+0

Ja, Referenzen sind gut aber wir kennen keine tatsächlichen Klassennamen aus der Frage, außerdem sollten Sie "()" in allen Maps entfernen, um Kompilierungsfehler zu vermeiden. –

Verwandte Themen