让好代码生生不息-更好的对待NULL
文章目录
什么样的代码是好代码
易读的代码,行云流水的代码
JAVA中的NULL处理
众所周知,在Java代码中总是少不了一堆的判null逻辑,在代码bug中,NullPointerException出镜率也是非常高的,尤其是现在的主流分布式架构,一个web接口要调用后端的N个RPC服务来实现功能,基于防御编程的思想,判null就更重要了
在处理NULL时怎么做更好
IDE
既然无法避免null,IDE就给程序员增加了可以快速判断空的功能,比如在IDEA中,可以使用Postfix功能,在对象上o使用.nn来快速输入if(o != null) {}
JAVA基础类库
近期的JDK版本也针对null判断增加了一些实用的方法
Objects类
JAVA8在Objects工具提供了isNull()和nonNull()方法,JAVA9又增加了requireNonNullElse()和requireNonNullElseGet()来给待处理对象增加设置默认值的方法
知名三方库
Apache common utils中提供了非常多的判空工具类,如针对String操作的StringUtils类和针对集合操作的CollectionUtils、MapUtils、ListUtils、SetUtils,这几个类都有一些典型的方法来进行判空处理,通用的方法如下:
StringUtils
-
isEmpty()/isNotEmpty()
判断String是否为空/不空
-
isBlank()/isNoneBlank()
判断String是否为空/不空,这类方法还会判断实际值是否为空串
-
defaultString()
此方法允许在String为null时为返回空串
-
defaultIfBlank()/defaultIfEmpty()
此方法允许在String为空串或null时设置一个默认值
集合类Utils
-
isEmpty()/isNotEmpty()
判断集合是否为空/不空
-
emptyIfNull()
这是一个很有用的方法,当传入对象为空时则返回设置的默认对象,可以很好的根治if处理null的问题,下面两段代码演示一下
- 正常情况下有if判断
1 2 3 4 5
List<Object> values = rpcClient.getFromRpcList(); if(CollectionUtils.isNotEmpty(values)) { return values .forEach(System.out::println); }
- 使用emptyIfNull方法
1 2
return CollectionUtils.emptyIfNull(rpcClient.getFromRpcList()) .forEach(System.out::println);
这样保证了代码编写的连贯性,爽!
此方法在ListUtis、MapUtils、SetUtils中也有提供
-
defaultIfNull()
此方法允许在集合为null时设置一个默认值,也是可以链式操作
优秀的Coder
在编写通用方法时,对于有null返回的情况可以使用返回默认值来代替null
不返回空,以空对象来代替
比如返回一个new Object()
使用Optional
JDK9中可以调用Optional.empty()表示空
集合类返回空集合
JDK中Collections类中emptyList()/emptySet()/emptyMap()来优雅的返回空集合