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