T O P

[资源分享]     Objects.requireNonNull的意义是什么

  • By - 楼主

  • 2022-11-25 00:02:03
  • Objects.requireNonNull方法的源码是这样:

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

    曾几何时,我的想法是,这个判断对象为 null,再抛出NPE没啥用啊,参数为null自然就会抛空指针异常,还用得着手动抛出吗?

    其实是有意义的,总结就是:

    1. 明确代码意图
    2. Fail-fast 快速失败

    Objects.requireNonNull让方法的调用者明确某个参数不能为 null。比如,写方法的单元测试,不需要考虑方法参数为null的场景,因为这个场景的是受控的,是不允许的。

    Fail-fast的意思是让代码尽可能早的发生失败,而不是在中途失败。Fail-fast的好处,首先是能立即且稳定的检测出代码的问题,代码立即报错,避免了无用的代码操作。在平时写业务代码时,校验逻辑尽可能放在方法前,避免业务在校验不通过前,做了无用操作。比如:

    public String getUserName(User user, String countryCode) {
        queryCountry(countryCode);
        return getUserLastName(user);
    }
    
    public String getUserLastName(User user) {
        return user.getName().getLastName();
    }
    

    user为 null时, queryCountry就是无用操作。

    Fail-fast能快速定位错误位置,也方便Dubug。如果user参数为 null,你能定位到哪一行报错,但还不能确保是user还是user.getName()的问题,所以你要去调试。如果变量的引用层级更深,定位问题源就更麻烦。如果在源头处控制了user的行为,那么后续操作就令人放心。从另一方面讲,也提升了程序的稳定性。

    最后, lombok的@NonNull注解也有这样的功能。比如:

    public int getLength(@NonNull String str) {
        return str.length();
    }
    

    编译后的效果是:

    public int getLength(@NonNull String str) {
        if (str == null) {
            throw new NullPointerException("str is marked non-null but is null");
        } else {
            return str.length();
        }
    }
    

    使用哪种方式看团队规范。

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册