查看原文
其他

JDK中的这个类可以让我们安全地处理一些涉及null的操作

码农小胖哥 码农小胖哥 2021-05-26

1. 前言

Java 开发中经常要对对象进行非空判断以防止出现空指针。大部分同学都喜欢用下面这种方式来进行判断:

if (obj!=null){
    // 判断不等于空
}
if (obj==null){
    // 判断等于空
}

这种方式没有什么问题。不过在 Java 7 中专门提供了一个工具类java.util.Objects可以处理的更好。

2. Objects

java.util.Objects提供了一系列的静态方法来处理日常一些针对对象的操作。

空值判断

比如开始提到的null值判断我们可以优化为:

if (Objects.nonNull(obj)){
    // 判断不等于空
}
if (Objects.isNull(obj)){
    // 判断等于空
}

空值检查

空值检查并不等同于空值判断,空值判断是根据对象是否为空而执行不同的分支策略,而空值检查是要求对象不能为空。为此Objects提供了如下方法:

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

此方法主要用于在方法和构造函数中进行参数验证,例如:

   public Foo(Bar bar) {
           this.bar = Objects.requireNonNull(bar);
   }

如果你需要自定义抛出空指针信息时可以使用其重载方法requireNonNull(T obj, String message) :

public Foo(Bar bar, Baz baz) {
       this.bar = Objects.requireNonNull(bar, "bar must not be null");
       this.baz = Objects.requireNonNull(baz, "baz must not be null");
}

对象比较

一般情况下对象比较我们喜欢使用:

obj.equals(other)

但是并不是每次此方法都能凑效,如果objnull则会抛出空指针异常,因此我们需要对obj进行前置非空判断。对此Objects也提供了对应的解决方案:

 public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
 }

但是使用的时候也需要注意一些坑,Objects.equals在处理基础数据类型和封装类型的比较时会出现一些让人意想不到的问题:

Objects.equals(2,2L)

上面的结果居然是false! 通过源码发现Objects.equals在进行比较时会自动对基本类型做封装,也就是说它把2封箱为Integer2L封箱为Long,类型不同自然为false

尽量保证Objects.equals的两个对象类型一致。

对象深度比较

Objects中还有一个deepEquals方法,此方法的功能比较强大,不仅可以比较对象是否相同,如果该对象是数组还可以比较内容是否相同,但是胖哥并不常用。

其它方法

Objects也对hashtoString以及对两个对象进行比较的方法(Comparatorcompare的封装,其中也涉及了对空的处理,不过这几个方法确实不太常用,有兴趣的可以去研究一下。

用Spring的这个类来读取配置文件真的是赞

2020-12-18

为了写这个Java微信支付V3开发包,我找出了微信支付文档至少六个错误

2020-12-15

那些看上去高大上的项目文档和个人博客原来用了这些技术

2020-12-16


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存