天殇云雾
天殇云雾
发布于 2024-01-15 / 64 阅读
0
1

自动拆箱调用过程

问题描述

代码规范是在使用装箱类型 java.lang.Boolean​ 作为确定控制流的表达式时,建议使用显式的空值检查来避免可能的 NullPointerException​。

应该避免这种转换并null显式处理该值。

示例

//布尔值 b
if (b) {
}

此处如果是一个基本类型,也就是boolean​的时候不会出现问题。

但如果是一个java.lang.Boolean​类型的对象,则在b​为null​的时候,抛出NPE​这是因为底层调用了java.lang.Boolean#valueOf(boolean)​拆箱

	@NotNull  
	public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

如果调用的是Boolean​包装类

if (b) {
}

相当于

if (Boolean.valueOf(b)) {
}

建议不要使用包装类来进行条件判断,如果不得已可以使用下面的方法进行判断。

// 对于 b == false 和 b == null 都会被调用
if(Boolean.TRUE.equals(b)){
}

tips!

在java8java.util.function包中提供了大量用于lambda 表达式的接口函数定义,例如IntFunction<Foo> 应该优先于Function<Integer, Foo>,可以避免不必要的自动装箱。

常用的方法(例)

Function<Integer, R> ——》 IntFunction<R>
Function<Long, R> ——》 LongFunction<R>
Consumer<Integer> ——》 IntConsumer


评论