Как избавиться от проверок на null и if-else, если подпись в этом коде?
Я получаю сложный объектный ответ. Это выглядит так:
class ComplexObject{
private PartOne partOne;
private PartTwo partTwo;
private PartThree partThree;
}
И мне нужно обработать этот ответ. Теперь я делаю это так:
if (partOne!= null) {
processOne(partOne);
} else if (partTwo != null) {
processTwo(partTwo);
} else if (partThree != null) {
processThree(partThree);
}
Но это выглядит плохо. Если бы я мог влиять на внешний сервис, я бы добавил enum Status.PART_ONE, Status.PART_TWO, Status.PART_THREE
но я не могу этого сделать
Как мне переписать этот код, чтобы он стал чище?
2 ответа
Решение
Если PartOne
, PartTwo
, PartThree
не входите в базовый класс, вы не сможете воспользоваться полиморфизмом.
В этом случае ваш реальный путь - приемлемый компромисс.
Я бы просто написал так:
if (partOne!= null) processOne(partOne);
else if (partTwo != null) processTwo(partTwo);
else if (partThree != null) processThree(partThree);
Как насчет использования java.util.Optional
предоставленный Java 8 как @ItFreak Предложенный в комментариях, Ваш код был бы похож
Optional.ofNullable(partOne).ifPresent(p -> processOne(p));
Optional.ofNullable(partTwo).ifPresent(p -> processTwo(partTwo));
Optional.ofNullable(partThree).ifPresent(p -> processThree(partThree));
Если вы используете Java 9 или выше, вы можете сделать это
Optional.ofNullable(partOne).ifPresentOrElse(p -> processOne(partOne),
() -> Optional.ofNullable(partTwo).ifPresentOrElse(p -> processTwo(partTwo),
() -> Optional.ofNullable(partThree).ifPresent(p -> processThree(partThree))));