在Java中避免空检查

对于Java开发人员(从初级到专家)最糟糕的噩梦之一是空对象引用检查。 我很确定您已经看过几次这样的代码:

public void addAddressToCustomer(Customer customer, Address newAddress){if ( cutomer == null || newAddress == null)return;if ( customer.getAddresses() == null ){customer.setAddresses ( new ArrayList<>());}customer.addAddress(newAddress);
}

我个人不喜欢为空检查编写代码。 在这篇文章中,我将根据我在生产环境和系统中的个人经验,列出一些对我来说效果很好的事情。

  • 停止检查所有图层中的空对象。 仅将检查限制在上层,例如UI层,表示层或API控制器层。 换句话说,请确保没有空对象从上层传递到业​​务逻辑层。 例如,如果您正在使用Spring注释开发标准的Web应用程序,则可能会有一些类带有@Repository,@Service和@Controller注释。 控制器负责接收客户端的数据,并将其传递给@Service类进行处理。 确保没有空对象传递到服务层是他们的责任。 服务类及以下类不应为null安全。 如果使用null调用它们,则应抛出NPE来警告开发人员应解决此错误。 请记住,NPE不是用户错误,而是开发人员的错误,应始终避免。 对来自html表单的用户输入或其他用户界面输入执行相同的操作。
  • 如果您遵循上述方法,您将不会再基于对象为空或非null的事实来编写业务逻辑。 空对象不应用于决定系统的行为。 它们是非凡的值,应将其视为错误和无效的业务逻辑状态。
  • 从方法返回列表时,请始终返回一个空列表,而不是null。 这将允许客户端在不检查null的情况下迭代列表。 迭代一个空列表是完全可以接受的,并且什么都不做,而迭代一个空列表将抛出NPE。
  • 在持久层中,当您搜索特定对象(即使用其标识符)而找不到该对象时,一种非常常见的方法是返回一个空对象。 好吧,这将使所有客户端手动检查此空值。 在这种情况下,您有两种选择。 抛出运行时异常(即ObjectNotFoundException)或返回空的Object。 我已经使用了这两个选项,我的建议是根据系统的整体体系结构以及所使用的工具/框架来对它们进行评估。
  • 在比较字符串时,请始终始终将不太可能为null的字符串放在第一位,而不是:
customer.getAddress().getStreet().equals("Times Square")

喜欢:

"Times Square".equals(customer.getAddress().getStreet())
  • 如果您正在使用或计划使用Java8,那么这里提供了新的Optional类。 检查这篇文章 ,清楚地说明了Optional的用法。

下次您要编写一些空检查代码时,请三思而后行,以决定是否多余。

翻译自: https://www.javacodegeeks.com/2014/08/avoiding-null-checks-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux sudo 详解

简单的说&#xff0c;sudo 是一种权限管理机制&#xff0c;管理员可以授权于一些普通用户去执行一些 root 执行的操作&#xff0c;而不需要知道 root 的密码。严谨些说&#xff0c;sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然&#xff0c;能做什么…

echarts自定义图例legend文字和样式

话不多说&#xff0c;先上效果图。 要完成这个图并不难&#xff0c;主要是下面那个图例比较难&#xff0c;需要定制。 让我们从官方文档找找思路&#xff0c;官方文档关于legend.formatter是这样的&#xff1a;链接在这 难点在于&#xff1a; 1.这里的图例文本包含两个变量&am…

DataGridView常见用法和FAQ汇总

前段时间在项目中用到了WinForm&#xff0c;其中最复杂的控件当属DataGridView了&#xff0c;特别喜欢它那高度的可配置性(提供了大量的属性&#xff0c;方法和事件)、丰富的内置列类型&#xff0c;而且易于扩展&#xff0c;对性能问题也提供了良好的解决方案。不过最初看着它那…

信息的Raid存储方式,更安全的保障,更花钱的保障!

raid0 就是把多个&#xff08;最少2个&#xff09;硬盘合并成1个逻辑盘使用&#xff0c;数据读写时对各硬盘同时操作&#xff0c;不同硬盘写入不同数据&#xff0c;速度快。  raid1就是同时对2个硬盘读写&#xff08;同样的数据&#xff09;。强调数据的安全性。比较浪费。 …

Java调试器和超时

在代码中存在超时的情况下如何使用调试器。 我的调试器王国&#xff01; 因此&#xff0c;您一直忙于编写一个项目&#xff0c;一切顺利&#xff0c;直到出现错误为止。 您可以进入开发人员的工具箱&#xff0c;然后拔出调试器。 很棒–您可以设置断点&#xff0c;可以在发生异…

【题解】整理书本

题目描述 小A想把他满屋子的书整理一下。书本分成若干堆。每一堆的书本都有质量w和价值v。小A的任务是将所有书合成一堆。因为小A认为合并i&#xff0c;j两堆的书所需要的力为w[i]-v[i]w[j]-v[j]。合并后的书堆的质量和价值均为合并前两堆书的质量和价值的总和。也就是说&#…

C#正则表达式编程(二):Regex类用法

上一篇讲述了在C#中有关正则表达式的类之间的关系&#xff0c;以及它们的方法&#xff0c;这一篇主要是将Regex这个类的用法的&#xff0c;关于Match及MatchCollection类会在下一篇讲到。对于正则表达式的应用&#xff0c;基本上可以分为验证、提取、分割和替换。仅仅利用Regex…

浏览器记住密码的自动填充Input问题完美解决方案

1、input 前from和input占位隐藏 <form style"width:0;height:0;display:none;"><input type"password" /></form><input type"password" style"width:0;height:0;display:none;" /> 2、input autocomplete&…

Java数字格式

当我看到其他人编写不必要的Java代码并且由于缺乏对已经提供所需功能的JDK类的了解而编写了不必要的Java代码时&#xff0c;我会想到很多次。 这样的一个例子是时间相关的常量的使用硬编码值的写入&#xff0c;如60 &#xff0c; 24 &#xff0c; 1440 &#xff0c;和86400时TI…

数据模型设计

数据&#xff1a;是符号。例如 张三 模型&#xff1a;现实世界事与物特征的抽象与模拟。如飞机模型、空气动力模型。 数据模型&#xff1a;通过对现实世界的事与物主要特征的分析、抽象&#xff0c;为信息系统的实施提供数据存取的数据结构以及相应的约束。 数据模型的要素由操…

优课在线 嵌入式系统(胡威)2018春季测验 参考解析

一、单选题 (共 20.00 分) μCOS-II操作系统属于&#xff08; &#xff09;。 A.一般实时操作系统 B.非嵌入式实时操作系统 C.占先式实时操作系统 D.非占先式实时操作系统 正确答案&#xff1a;C 寄存器R13除了可以做通用寄存器外&#xff0c;还可以做&#xff08; &#xff0…

JBoss Wildfly 8.1上的HawtIO

HawtIO为基于JVM的中间件提供了令人赞叹的视觉效果。 它是应用程序的统一控制台&#xff0c;否则将不得不构建自己的糟糕的Web控制台。 老实说&#xff0c;它们的构建方式各不相同&#xff0c;技术不同&#xff0c;用户体验不同&#xff0c;并且都围绕一种可怕的方式来尝试在QA…

Maven打包时去掉项目版本号

Maven打包时去掉项目版本号 Maven打包后&#xff0c;jar或war文件名里带有版本号信息&#xff0c;如projectname0.0.1-SNAPSHOT.jar等&#xff0c;怎么去掉呢&#xff1f; 解决办法&#xff1a; 打开项目pom.xml文件&#xff0c;在<build> </build>标签内加入如下…

jsp实现上一页下一页翻页功能

前段时间一直忙于期末考试和找实习&#xff0c;好久没写博客了。 这段时间做了个小项目&#xff0c;包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深&#xff0c;打算玩深后再写篇博客。 要实现翻页功能&#xff0c;只需要设置一个pageIndex即可&#xf…

学习笔记之postgresql

/*************************************************************************创建人&#xff1a;LYK 创建时间&#xff1a;2019/05/05 14:47IDE: vs2013 库版本&#xff1a;32位 静态库数据库管理平台 pgAdmin III -- postgresql 注意事项&#xff1a;1&#xff0c;添加头文件…

Delphi关于多线程同步的一些方法

(注&#xff1a;本文为转载 http://hi.baidu.com/navy1130/blog/item/468fcdc448794fce38db49ee.html)线程是进程内一个相对独立的、可调度的执行单元。一个应用可以有一个主线程&#xff0c;一个主线程可以有多个子线程&#xff0c;子线程还可以有自己的子线程&#xff0c;这…

自定义Cassandra数据类型

在博客文章《 从Java连接到Cassandra》中 &#xff0c;我提到了用Java 实现的Cassandra Java开发人员的一个优势是能够创建自定义 Cassandra数据类型 。 在这篇文章中&#xff0c;我将详细介绍如何执行此操作。 Cassandra具有许多内置的数据类型 &#xff0c;但是在某些情况下…

Linux下如何查看版本信息

Linux下如何查看版本信息 Linux下如何查看版本信息&#xff0c; 包括位数、版本信息以及CPU内核信息、CPU具体型号等等&#xff0c;整个CPU信息一目了然。一些常用的 Linux 命令 1、# uname &#xff0d;a &#xff08;Linux查看版本当前操作系统内核信息&#xff09; [hadoopa…

Docker的安装及注意事项

Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…

基于CSS的个人网页

前端时间做的CSS作业&#xff1a;基于CSS的个人网页 基于CSS的个人网页 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>吴广林的个人博客</title><link rel"styles…