什么样的代码是好代码

易读的代码,行云流水的代码

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的问题,下面两段代码演示一下

    1. 正常情况下有if判断
    1
    2
    3
    4
    5
    
    List<Object> values = rpcClient.getFromRpcList();
    if(CollectionUtils.isNotEmpty(values)) {
        return values
            .forEach(System.out::println);
    }
    
    1. 使用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()来优雅的返回空集合