Java 使用对象类型(Long)作为参数类型是个坏主意吗?
例如,函数setX定义如下:Java 使用对象类型(Long)作为参数类型是个坏主意吗?,java,exception,Java,Exception,例如,函数setX定义如下: public void setX(Long l) { ..... ..... } 如果在参数中使用null值调用函数,那么会发生什么?如果我们在函数中的某个位置执行自动取消装箱,是否会导致NPE异常 作为一种实践,我们可以安全地说,使用Long作为函数的参数是一种不好的实践,而应该始终使用Long?如果您在不检查null的情况下自动将Long解装箱到Long,您将得到NullPointerException 如果您的方法处理传递给它的null值,则使用
public void setX(Long l) {
.....
.....
}
如果在参数中使用null值调用函数,那么会发生什么?如果我们在函数中的某个位置执行自动取消装箱,是否会导致NPE异常
作为一种实践,我们可以安全地说,使用Long作为函数的参数是一种不好的实践,而应该始终使用Long?如果您在不检查null的情况下自动将
Long
解装箱到Long
,您将得到NullPointerException
如果您的方法处理传递给它的null
值,则使用Long
而不是Long
是有意义的。如果您从未打算传递null
,则应使用long
如果您使用的是Java 8或更高版本,也可以使用OptionalLong
如果您的方法是setter(即设置某个实例变量的值),如
setX
名称所示,则只有当相应的实例变量也是Long
时,才有意义将参数设置为Long
(假设允许为null
).如果在不检查null的情况下将Long
自动取消装箱到Long
中,您将获得NullPointerException
如果您的方法处理传递给它的null
值,则使用Long
而不是Long
是有意义的。如果您从未打算传递null
,则应使用long
如果您使用的是Java 8或更高版本,也可以使用OptionalLong
如果您的方法是一个setter(即设置某个实例变量的值),正如
setX
名称所暗示的那样,那么只有当相应的实例变量也是Long
(假设它被允许为null
)时,才有意义将参数设置为Long
。不,这不是个坏主意
- 当您的方法不接受
时,请务必使用null
long
- 当您的方法接受并正确使用
时,请务必使用null
李>Long
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
不,这主意不错
- 当您的方法不接受
时,请务必使用null
long
- 当您的方法接受并正确使用
时,请务必使用null
李>Long
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
您问这个问题的事实意味着您不需要传递
null
。(因为如果您确实需要通过它,那么long
根本不适用!)
因此,假设您不需要传递null
,long
优于long
,原因如下:
Long
,如果意外地传递了null
,则始终存在NPE的可能性。如果您测试null
以避免NPE,并找到null
。。。那你怎么办?(回答:也许你不应该测试!)Long
相比,装箱和取消装箱Long
的运行时开销较小Long
比Long
占用更多的堆空间您问这个问题的事实意味着您不需要传递
null
。(因为如果您确实需要通过它,那么long
根本不适用!)
因此,假设您不需要传递null
,long
优于long
,原因如下:
Long
,如果意外地传递了null
,则始终存在NPE的可能性。如果您测试null
以避免NPE,并找到null
。。。那你怎么办?(回答:也许你不应该测试!)Long
相比,装箱和取消装箱Long
的运行时开销较小Long
比Long
占用更多的堆空间最好使传递
null
不可能(通过使用long
),其次是在传递null
时抛出异常,在null
情况下让程序执行未被检测到的无意义操作非常糟糕。最好使传递null
不可能(通过使用long
),其次,如果传递了null
,则最好抛出异常,在null
情况下,让程序执行未被检测到的无意义操作是非常糟糕的。