代码之家  ›  专栏  ›  技术社区  ›  ip696

如何摆脱对空值的检查,如果此代码中有签名,是否还有其他检查?

  •  3
  • ip696  · 技术社区  · 6 年前

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

        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 回复  |  直到 6 年前
        1
  •  2
  •   davidxxx    6 年前

    如果 PartOne , PartTwo , PartThree 不要成为基类的一部分,您不能利用多态性。
    在这种情况下,您的实际方法是可以接受的折衷。

    我只是这样写:

    if (partOne!= null) processOne(partOne);
    else if (partTwo != null) processTwo(partTwo);
    else if (partThree != null) processThree(partThree);
    
        2
  •  0
  •   SamHoque    6 年前

    如何使用 java.util.Optional 由Java 8提供的,如注释中建议的“iTFRADAK”,代码看起来像

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