как избавиться от проверок на null и if-else, если подпись в этом коде? - PullRequest
0 голосов
/ 12 декабря 2018

Я получаю сложный объектный ответ.Это выглядит так:

    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 ]

0 голосов
/ 12 декабря 2018

Если PartOne, PartTwo, PartThree не входят в базовый класс, вы не можете воспользоваться полиморфизмом.
В этом случае ваш реальный путь - приемлемый компромисс.

Я бы просто написал так:

if (partOne!= null) processOne(partOne);
else if (partTwo != null) processTwo(partTwo);
else if (partThree != null) processThree(partThree);
0 голосов
/ 12 декабря 2018

Как насчет использования 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))));
...