首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java嵌套If或single if

java嵌套If或single if
EN

Stack Overflow用户
提问于 2015-09-18 10:48:27
回答 2查看 986关注 0票数 15

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

代码语言:javascript
复制
String version = computer.getSoundcard().getUSB().getVersion();

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

所以我做到了,

选项1 :

代码语言:javascript
复制
if(computer!=null && 
        computer.getSoundCard() !=null && 
                 computer.getSoundCard().getUSB()!=null) {
   version = computer.getSoundcard().getUSB().getVersion();
}

选项2 :

代码语言:javascript
复制
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:将选项2从

代码语言:javascript
复制
version = computer.getSoundcard().getUSB().getVersion();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-18 10:53:45

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

是的,这些电话会被打很多次。但是,如果将赋值作为条件的一部分,则可以缩短它,如下所示:

代码语言:javascript
复制
SoundCard sc;
USB usb;
if(computer != null && (sc = computer.getSoundCard()) != null && (usb = sc.getUSB()) != null) {
    version = usb.getVersion();
}

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

票数 17
EN

Stack Overflow用户

发布于 2015-09-18 11:09:05

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

代码语言:javascript
复制
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块。您甚至可以在以后非常容易地向此方法添加更多的条件检查代码。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32643048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档