我对以下代码块(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:从
更改了选项2version = computer.getSoundcard().getUSB().getVersion();
答案 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();
}
请注意,表达式内和条件内部对sc
和usb
的引用是安全的,因为&&
评估在到达第一个false
时会保证停止链