Как избавиться от проверок на 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))));
Другие вопросы по тегам