java嵌套If或单个If



我对下面代码块(示例)的执行有一个基本的疑问:

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

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

所以我有

选项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次。

我的理解正确吗?

EDIT 1: Changed Option 2 from

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

更好的方法是将此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将有额外的开销,因为它必须多次计算相同的表达式

是的,这些调用将被多次调用。但是,如果您将赋值作为条件句的一部分,则可以缩短它,例如:

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

注意,在表达式内和条件内对scusb的引用是安全的,因为&&的求值保证在到达链中的第一个false时停止。

最新更新