使用对象类型(LONG)作为参数类型不是一个好主意吗?

时间:2018-12-16 08:17:31

标签: java exception

说,函数setX定义如下:

public void setX(Long l) {
   .....
   .....
}

如果使用参数中的空值调用该函数,那会发生什么?如果我们在函数中的某处进行自动拆箱,是否会导致NPE异常?

我们可以安全地说一种做法吗,那就不好用Long作为函数的参数,而应该始终使用long吗?

3 个答案:

答案 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,则longLong更可取,原因如下:

  1. 使用Long时,如果null意外通过,则总是存在NPE的可能性。并且如果您测试null以避免NPE,并找到null ...您会怎么做? (答案:可能您不应该测试!)

  2. Long进行装箱和拆箱与传递和使用long相比,运行时的开销较小。

  3. 在大多数情况下,
  4. Longlong消耗更多的堆空间。