Java Вложенный Если или нет, если

У меня есть основное сомнение в отношении выполнения следующего кода (Образец):

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

Ответы

Ответ 1

В соответствии с моим пониманием Вариант 1 будет иметь дополнительные накладные расходы, поскольку он должен оценивать одно и то же выражение несколько раз

Да, эти вызовы будут выполняться несколько раз. Однако вы можете сократить его, если вы выполняете задания как часть вашего условного выражения, например:

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

Обратите внимание, что ссылки на sc и usb внутри выражения и внутри условного кода являются безопасными, так как оценка && гарантируется остановкой при достижении первой false в цепочке.

Ответ 2

Лучшим подходом является извлечение этого кода для получения 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. Вы даже можете добавить еще несколько кодов проверки условий этого метода позже очень легко.