Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在这段代码中去掉null和if-else-if签名的检查?_Java_Design Patterns_Code Cleanup_Clean Architecture - Fatal编程技术网

Java 如何在这段代码中去掉null和if-else-if签名的检查?

Java 如何在这段代码中去掉null和if-else-if签名的检查?,java,design-patterns,code-cleanup,clean-architecture,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) {

我得到复杂的物体反应。它看起来像这样:

    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);
    }
我需要处理这个反应。现在我这样做:

    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_-TWO,Status.PART_-TWO,但是我做不到


如何重写此代码以使其更干净?

如何使用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));
如果您使用的是Java9或更高版本,您可以这样做

Optional.ofNullable(partOne).ifPresentOrElse(p -> processOne(partOne),
        () -> Optional.ofNullable(partTwo).ifPresentOrElse(p -> processTwo(partTwo), 
                () ->  Optional.ofNullable(partThree).ifPresent(p -> processThree(partThree))));

如果
第一部分
第二部分
第三部分
不构成基类的一部分,则无法利用多态性。
在这种情况下,您的实际方式是一种可接受的权衡

我会这样写:

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

我想这三个部分都不一样,对吧?因此,您确实需要一种不同的方法来处理每一个问题—可选:可选partOne。然后执行if(partOne.isPresent())如果ComplexObject中一次只有一个部分是非null的,那么最好的做法是使用抽象方法process()从ComplexObject中提取出部分,并为部分提供三个具体类,例如partOne、PartTwo和parttwree.1)
Optional.of()
如果null作为参数2传递,则可能引发NullPointerException)
ifPresent()
返回一个
使用者
。类似的内容是必需的:
Optional.ofNullable(partOne).ifPresent(p->processOne(p))你看到了什么
Empty.of()
@davidxxxI已将其更改为
of nullable
谢谢:)我没有理由解释消费者部分,如果我使用IDE,我会发现此错误,但我只是在SO帖子上直接编写了代码:P@SamzSakerz你真的认为这个选项比原来的好吗?)不幸的是,这些是完全不同的类。第一部分是对细节的成功回应。第二部分是详细信息错误(状态、说明)。第三部分也是一种错误(另一种错误)。丑陋的api。老实说,有一个
enum
——但是在
可选的
情况下,第三方在任何情况下都会返回相同的类型(成功、错误或其他),如果第一部分不为null,我不需要继续,我如何中断算法?在这种情况下,我将坚持使用您的实际代码。3空检查不是闹剧。事实上,改进此代码的一种可能性是更改返回3个对象的客户机服务类。使它们返回一个可选的对象。通过这种方式,这将使实际代码更清晰。MyComplexObject-JAXB对象(自动生成)。在processing方法中,如果Part2和Part1不为null-发生了什么?此解决方案的行为是否与问题中的解决方案稍有不同?在这个问题上,最多调用一个过程方法;在这里,最多可以叫三个。