说,函数setX定义如下:
public void setX(Long l) {
.....
.....
}
如果使用参数中的空值调用该函数,那会发生什么?如果我们在函数中的某处进行自动拆箱,是否会导致NPE异常?
我们可以安全地说一种做法吗,那就不好用Long作为函数的参数,而应该始终使用long吗?
答案 0 :(得分:4)
如果将Long
自动拆箱到long
中而不检查是否为空,则会得到NullPointerException
。
如果您的方法处理传递给它的Long
值,则使用long
而不是null
是有意义的。如果您从不打算通过null
,则应使用long
。
如果您使用的是Java 8或更高版本,则也可以使用OptionalLong
。
如果您的方法是setter(即设置某个实例变量的值)(如setX
名称所隐含,则只有相应实例的Long
的自变量才有意义)变量也为Long
(假设允许为null
)。
答案 1 :(得分:1)
不,这不是一个坏主意!
long
时,请使用null
。Long
并正确使用时,请使用null
。 我个人试图避免进行空检查,因此,我会尽可能使用long
。
public void setX(Long l) {}
public void setY(long l) {}
客户端:
setX(1L); // OK - use long as parameter's value -> autoboxing to Long
setX(new Long(1L)); // OK - use Long as parameter's value
setX(null); // OK - use null as parameter's value -> Long is Object and null is correct value
setY(1L); // OK - use long as parameter's value
setX(new Long(1L)); // OK - use Long as parameter's value -> autounboxing to long
setX(null); // Compile time error - use null as parameter's value -> long is not an Object and null is not correct value
答案 2 :(得分:0)
您在问这个问题的事实意味着您并不需要通过null
。 (因为如果您 did 需要通过它,那么long
就根本不适用!)
因此,假设您不需要通过null
,则long
比Long
更可取,原因如下:
使用Long
时,如果null
意外通过,则总是存在NPE的可能性。并且如果您测试null
以避免NPE,并找到null
...您会怎么做? (答案:可能您不应该测试!)
对Long
进行装箱和拆箱与传递和使用long
相比,运行时的开销较小。
Long
比long
消耗更多的堆空间。