内容简介:文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/作者:犬小哈 来源:小哈学java要说 Java 编程中哪个异常是你印象最深刻的,那
文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/
作者:犬小哈 来源:小哈学java
要说 Java 编程中哪个异常是你印象最深刻的,那 NullPointerException
空指针可以说是臭名昭著的。不要说初级 程序员 会碰到,即使是中级,专家级程序员稍不留神,就会掉入这个坑里。
Null
引用的发明者 Tony Hoare 曾在 2009 年作出道歉声明,声明中表示,到目前为止,空指针异常大约给企业已造成数十亿美元的损失。
下面是 Tony Hoare 的原话:
我将 Null 引用的设计称为是一个数十亿美元的错误。1965 那年,我正在用面向对象语言(ALGOL W) 设计首个功能全面的系统。当时我的考量是,确保所有被使用的引用都是安全的,编译器会自动进行检查。但是,我没有抵住诱惑,加入了 Null 引用,仅仅是为了实现起来省事。这之后,它导致了数不清的 bug、错误和系统崩溃,也为企业导致了不可估量的损失。
事已至此,我们必须学会面对它。So, 我们要如何防止空指针异常呢?
唯一的办法就是对可能为 Null 的对象添加检查。但是 Null 检查是繁琐且痛苦的。所以一些比较新的语言为了处理 Null 检查,特意添加了特殊的语法,如空合并运算符。
在 Groovy 或 Kotlin 这样的语言中也被称为 Elvis
运算符。
不幸的是,在老版本的 Java 中并没有提供这样的语法糖。Java8 中在这方面做了改进。所以,这篇文章就特意来介绍一下如何在 Java8 中利用新特性来编写防止 NullPointerException
的发生。
Java8 中如何加强对 Null 对象的检查?
在上篇文章 Java8 新特性指导手册 中简单的提了一下如何通过 Optional
类来对对象做空校验。接下来,我们再细说一下:
在业务系统中,对象中嵌套对象是经常发生的场景,如下示例代码:
业务中,假设我们需要获取 Outer
对象对底层的 Inner
中的 foo
属性,我们必须写一堆的非空校验,来防止发生 NullPointerException
:
通过 Optional
在 Java8 中,我们有更优雅的解决方式,那就是使用 Optional
是说,我们可以在一行代码中,进行流水式的 map
操作。而 map 方法内部会自动进行空校验 :
通过 suppiler 函数自定义方法
上面这种方式个人感觉还是有点啰嗦,我们可以利用 suppiler
函数来出一个终极解决方案:
利用上面的 resolve
方法来重构上述的非空校验代码段:
最后
你需要知道的是,上面这两个解决方案并没传统的 null
检查性能那么高效。但在绝大部分业务场景下,舍弃那么一丢丢的性能来方便编码,是完全可取,除非是那种对性能有严格要求的,我们才不建议使用。
个人觉得,真要拿这点性能说事,还不如去优化优化 sql
语句,业务逻辑等。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何在 Java8 中风骚走位避开空指针异常
- 如何避开 async/await 地狱
- 安全港计划:避开法律风险 保护善意黑客
- 如何通过人工智能“避开”内容安全的“坑”?
- HTTPS也不安全?No,只因没有避开这个误区
- 理解灭霸 | 手把手教你科学避开小长假出游高峰
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++标准模板库编程实战
Ivor Horton / 郭小虎、程聪 / 2017-1
《C++标准模板库编程实战》介绍最新的C++14标准的API、库和扩展,以及如何将它们运用到C++14程序中。在书中,作者Ivor Horton 则阐述了什么是STL,以及如何将它们应用到程序中。我们将学习如何使用容器、迭代器,以及如何定义、创建和应用算法。此外,还将学习函数对象和适配器,以及它们的用法。 阅读完本书之后,你将能够了解如何扩展STL,如何定义自定义类型的C++组件,你还将能够......一起来看看 《C++标准模板库编程实战》 这本书的介绍吧!