我对下面代码块(示例)的执行有一个基本的疑问:
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();
}
注意,在表达式内和条件内对sc
和usb
的引用是安全的,因为&&
的求值保证在到达链中的第一个false
时停止。