Вчера мне пришлось написать уродливый кусок кода, чтобы выполнить множество нулевых проверок полей объекта, чтобы избежать NPE из конструкции тернарного оператора.
Проблемный кусок кода:
ResourceThresholds rt = getThresholdsFromConfig();
Thresholds defaultPerContainer = getDefaultThresholds();
return new Thresholds((!rt.getCpu().equals("")) ? Long.parseLong(rt.getCpu()) : defaultPerContainer.getCpu(),
(!rt.getMemory().equals("")) ? Long.parseLong(rt.getMemory()) : defaultPerContainer.getMemory(),/*omitted for brevity*/);
Я получаю NPE на defaultPerContainer.getCpu()
, потому что поле cpu = null
. И это нормально, Java работает так, как работает. Почему я просто не установил значение по умолчанию для поля Long cpu = 0L;
? Потому что мне нужно значение null
как индикатор того, что мы не устанавливаем никакого значения.
Окончательный функциональный вариант этого конкретного фрагмента кода получился таким:
Long cpuVal;
if (!rt.getCpu().equals("")) {
cpuVal = Long.parseLong(rt.getCpu());
} else {
cpuVal = defaultPerContainer.getCpu();
}
Long memory;
if (!rt.getMemory().equals("")) {
memory = Long.parseLong(rt.getMemory());
} else {
memory = defaultPerContainer.getMemory();
}
//... many similar if-elses that give me the desired value;
//which is really ugly, and I believe I am not the only one hitting this.
return new Thresholds(cpuVal, memory..);
Этот код работает так, как мне нужно, но он уродлив!
Q1: Может ли кто-нибудь подсказать мне, могу ли я найти способ использовать Optional<T>
для разрешения NPE в первом варианте с тернарным оператором? Потому что этот фрагмент работает: !rt.getCpu().equals("")) ? Long.parseLong(rt.getCpu()) : null
т.е. если я явно поставил null
в качестве значения, я получаю null
при выполнении условия.
В общем, есть ли какой-нибудь элегантный способ Java 8+ справиться с этим?
Вопрос 2: как оптимизировать великолепную конструкцию if-else для проверки на null?
?
и:
наnew Long(rt.getCpu())
? Если это исправит ситуацию, то это потому, что тернарная операция приводит к тому, что и истинная, и ложная части интерпретируются какlong
вместоLong
. - person Dawood ibn Kareem   schedule 21.01.2021