如何摆脱此代码中对null和if-else if签名的检查?

时间:2018-12-12 10:00:54

标签: java design-patterns code-cleanup clean-architecture

我得到复杂的对象响应。看起来像这样:

    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);
    }

但是看起来很糟糕。如果可以影响外部服务,则可以添加枚举Status.PART_ONE, Status.PART_TWO, Status.PART_THREE,但不能这样做。

如何重写此代码以使其更简洁?

2 个答案:

答案 0 :(得分:2)

如果PartOnePartTwoPartThree不属于基类,则您将无法利用多态性。
在这种情况下,您的实际方法是可以接受的折衷方案。

我会这样写:

if (partOne!= null) processOne(partOne);
else if (partTwo != null) processTwo(partTwo);
else if (partThree != null) processThree(partThree);

答案 1 :(得分:0)

如何使用Java 8提供的java.util.Optional(如@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))));