java - 避免(或委托(delegate)?)NPE 的模式

标签 java scala

在代码审查中,我偶然发现了这个 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/

相关文章:

scala - Scala 中的处理和抛出异常

syntax - Scala 中符号文字的一些示例用例有哪些?

java - Java 中的显式对象转换

java - Android 中的 jdbc 问题 - 无法连接到数据库

scala - 如何在 Tomcat 上部署 Scala/akka 应用程序?

scalaz:如何处理验证中的不同错误类型?

scala - 模式匹配中使用的抽象类型的类型不匹配

java - 如何在 Grails 中分页?

java - 如果只是为了搜索,是否值得将实体放在 @Transactional 服务层下?

java - 在java中用时区解析时间戳?