java嵌套if或single if

时间:2015-09-18 02:48:27

标签: java if-statement

我对以下代码块(Sample)的执行存在基本疑问:

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

如果NullPointerException不存在,可能会抛出Soundcard

所以我有,

选项1:

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

选项2:

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

根据我的理解,选项1 会产生额外的开销,因为它必须多次评估同一个表达式,例如computer.getSoundCard() 3次,computer.getSoundCard().getUSB() 2次。

我的理解是否正确?

编辑1:

更改了选项2
version = computer.getSoundcard().getUSB().getVersion();

2 个答案:

答案 0 :(得分:24)

更好的方法是将此USB版本获取代码提取到另一种方法,比如说getComputerUsbVersion(),然后将超长if或嵌套if-else块展平为几个简单的方法if阻止:

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();
}

正如您所看到的,代码更清晰,更易于理解,也避免了超长if条件或嵌套if-else块。您甚至可以在以后轻松地为此方法添加更多条件检查代码。

答案 1 :(得分:17)

  

根据我的理解,选项1将有额外的开销,因为它必须多次评估相同的表达式

是的,这些电话会多次拨打。但是,如果您将作业作为条件的一部分进行,则可以缩短它,如下所示:

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

请注意,表达式内和条件内部对scusb的引用是安全的,因为&&评估在到达第一个false时会保证停止链