Java 使用对象类型(Long)作为参数类型是个坏主意吗?

Java 使用对象类型(Long)作为参数类型是个坏主意吗?,java,exception,Java,Exception,例如,函数setX定义如下: public void setX(Long l) { ..... ..... } 如果在参数中使用null值调用函数,那么会发生什么?如果我们在函数中的某个位置执行自动取消装箱,是否会导致NPE异常 作为一种实践,我们可以安全地说,使用Long作为函数的参数是一种不好的实践,而应该始终使用Long?如果您在不检查null的情况下自动将Long解装箱到Long,您将得到NullPointerException 如果您的方法处理传递给它的null值,则使用

例如,函数setX定义如下:

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
    情况下,让程序执行未被检测到的无意义操作是非常糟糕的。