在将类作为其他类的属性嵌入的常见情况下,检查空值的最佳方法是什么?

为了说明我在说什么,请说我想访问this.getObject1().getObject2().someMethod(),其中getObject1()getObject2()可能返回null。现在,我正在执行以下操作,这很丑陋,必须有更好的方法:

if (this.getObject1() != null)
        if (this.getObject1().getObject2() != null)
            if (this.getObject1().getObject2().someMethod())
                return whatever;


为了避免NPE,我必须在访问someMethod()之前在每个步骤中检查null。有什么更好的方法可以做到这一点?

最佳答案

尽量避免使用这种样式-请参见Law of Demeter-尽管我很欣赏库或遗留代码可能不会给您太多选择。

特别是函数式编程语言通过使用OptionMaybe对象避免了这个问题,这些对象可以在Java中得到一定程度的使用。例如,请参见this article。使用Scala理解,例如eaxmple,可以简洁地避免长序列的空检查。但是回到Java ...

理想情况下,假设您可以修改正在调用的代码,则可以进行重组,以便可以调用“外部”对象,然后再调用“内部”对象,并且在每个阶段仅执行一次空检查。或重组代码以避免此类深层嵌套。

09-11 16:42