2015-09-18 7 views
15

Ich habe einen grundlegenden Zweifel an der Ausführung des folgenden Code-Block (Sample):java Verschachtelte Wenn oder einzelne wenn

String version = computer.getSoundcard().getUSB().getVersion(); 

Welche NullPointerException wenn Soundcard werfen könnte nicht da ist.

So habe ich,

Option 1:

if(computer!=null && 
     computer.getSoundCard() !=null && 
       computer.getSoundCard().getUSB()!=null) { 
    version = computer.getSoundcard().getUSB().getVersion(); 
} 

Option 2:

if(computer !=null){ 
    SoundCard sc = computer.getSoundCard(); 
    if(sc!=null){ 
     USB usb = sc.getUSB(); 
     if(usb!=null){ 
     version = usb.getVersion(); 
     } 
    } 
} 

Gemäß meinem Verständnis der Option 1 haben zusätzlichen Aufwand als es muss den gleichen Ausdruck multiple Tim bewerten es wie computer.getSoundCard() 3 mal, computer.getSoundCard().getUSB() 2 mal.

Ist mein Verständnis korrekt?

EDIT 1: Changed Option 2 von

version = computer.getSoundcard().getUSB().getVersion(); 
+9

Können Sie Java 8 auf Ihrem Projekt verwenden ... Wenn ja, schau dir das an: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html –

+0

tat ich Sehen Sie das, und leider muss ich niedrigere Version von Java auch verwenden, ich will verstehen, welcher von diesen besser ist und warum. – Deva

+1

Sie sind beide gut. Ich würde normalerweise mit Option 1 gehen, weil es prägnanter ist. Option 2 ist möglicherweise besser, wenn 1) Sie zu "version = usb.getVersion()" wechseln und 2) eine der Getter-Methoden langsam ist. – Andreas

Antwort

17

Gemäß meinem Verständnis der Option 1 wird zusätzlichen Aufwand hat, da es den gleichen Ausdruck mehrfach

zu bewerten hat Ja , diese Anrufe würden mehrmals gemacht werden. Allerdings können Sie es verkürzen, wenn Sie Zuweisungen im Rahmen Ihrer davon abhängig machen, wie folgt aus:

SoundCard sc; 
USB usb; 
if(computer != null && (sc = computer.getSoundCard()) != null && (usb = sc.getUSB()) != null) { 
    version = usb.getVersion(); 
} 

Beachten Sie, dass Verweise auf sc und usb innerhalb des Ausdrucks und innerhalb des bedingten sicher sind, weil && Auswertung garantiert zu stoppen bei Erreichen der ersten false in der Kette.

+1

Nur hinzufügen: Sie sollten erkennen, dass Sie die Variablen "sc" und "usb" in einem viel größeren Umfang definieren, wie Sie benötigen. Ich möchte einen if-Ausdruck in meinem Quellcode nicht lesen. – lschuetze

24

Ein besserer Ansatz ist es, diesen USB-Version-getting-Code in einer anderen einzelne Methode zu extrahieren, sagen getComputerUsbVersion(), glätten dann den super lange if oder den verschachtelten if-else Block in mehrere einfachen if Blöcke:

public String getComputerUsbVersion(Computer computer) { 

    if (computer == null) return null; 

    SoundCard soundCard = computer.getSoundCard(); 
    if (soundCard == null) return null; 

    USB usb = soundCard.getUSB() 
    if (usb == null) return null; 

    return usb.getVersion(); 
} 

Wie Sie können sehen, der Code ist viel sauberer und leicht zu verstehen, der super lange if Zustand oder der verschachtelte if-else Block wird ebenfalls vermieden. Sie können dieser Methode später sogar noch mehr Bedingungsüberprüfungscode hinzufügen.

+0

Ich stimme zu, weil dieses Formular die Logik kapseln wird, um die USB-Version zu erhalten. Nun, der Funktionsname könnte spezifischer sein, wie findSoundCardUsbVersion ... "finden", nicht "bekommen", weil man vermutet, dass es existiert ... und es gibt viele Rückkehrpunkte auf der Methode. –

+4

Noch besser wäre es, eine Ausnahme auszulösen (und einen Fehler zu protokollieren), wenn null gefunden wird. –

Verwandte Themen