在代码审查中,我偶然发现了这个 java 模式以避免 NPE:
value = (null != someObject) ? someObject.someOtherMethod() : null
我怀疑这是“好风格”。我宁愿认为它委托(delegate)了 NPE(顺便说一句,这听起来类似于映射 Scala-Option-value 或 Haskell-Maybe...)
这种风格好不好?如果没有,如何改进?
编辑:假设它分散了您的代码,代码将变得不可读: 这是否已封装在某些库/API 中?(apache-commons、google-coomons 或类似的!?)
最佳答案
这种模式说不好也说不好。您需要在上下文中对其进行评估。
关键问题是为什么 someObject
可以有 null
值,以及它是否有意义……还是一个错误。
一方面,
null
可能具有特定含义(例如“值未指定”),并且代码可能会以合法方式处理该含义。另一方面,
null
可能是错误的症状(例如,有人忘记初始化某些内容)。在这种情况下,代码会传播损害和/或使错误的来源更难找到......因此很糟糕。
作为一般观察,许多代码/程序员认为避免意外 NPE 的最佳方法是在整个代码库中随意散布此类内容作为预防措施。事实上,这是完全错误的做法。正确的方法是让 NPE 发生(或者更好的是,强制它发生 - 请参阅 @vacuum 的答案),找出意外的 null
来自哪里......并删除源。而且(当然!)您需要进行广泛的测试,以便在投入生产之前发现意外的空值。
IMO,最佳实践是将 null
视为错误,除非它具有明确定义和记录的含义。
关于java - 避免(或委托(delegate)?)NPE 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13136132/