来自Effective Java - Joshua Bloch
第49项 - 将原始类型选择为盒装基元
只要有盒子基元,就优先使用基元 选择。原始类型简单快捷。如果你必须使用盒装 原始人,小心! Autoboxing减少了冗长,但不是 危险,使用盒装基元。
当我需要一个总是返回一个原始值的方法时,该原始值是用它们的参数计算的,它们的参数可以来自Double对象,
我更喜欢编写代码:
public double someCalculation(double primitiveDouble, double anotherPrimitiveDouble) {
return primitiveDouble + anotherPrimitiveDouble;
}
代替:
public double someCalculation(Double doubleObject, double doublePrimitive) {
if (doubleObject!= null) {
return doubleObject+ doublePrimitive;
}
return 0d;
}
在调用者中,我对null和doubleValue()
在盒装原语doubleObject
中的调用进行了验证,如:
public void someCaller() {
double doublePrimitive = getSomeDoublePrimitive();
Double doubleObject = getSomeDoubleObject();
if (doubleObject != null) {
double result = someCalculation(doubleObject.doubleValue(), doublePrimitive)
}
.....
}
代替:
public void someCaller() {
double doublePrimitive = getSomeDoublePrimitive();
Double doubleObject = getSomeDoubleObject();
if (doubleObject != null) {
double result = someCalculation(doubleObject, doublePrimitive)
}
.....
}
当我调用方法someCalculation(double primitiveDouble, double anotherPrimitiveDouble)
时,我使用Double参数doubleValue()
中的doubleObject
调用doubleObject.doubleValue()
来明确取消doubleObject
的双原语值。
通过这种方式:
我确信我的方法得到一个原始的double而不是Double对象。
如果调用者中的null验证消失了,我会更接近堆栈跟踪中最终NullPointerException的位置。
我相信我提高了代码的可读性,因为我更清楚我的意图。
我将准确的参数传递给只需要原始类型的方法someCalculation(double primitiveDouble, double anotherPrimitiveDouble)
我的问题:
使用显式拆箱有什么优点/缺点?
当我调用一些只接受基本类型参数为doubleObject.doubleValue()
的方法时,可以使用someCalculation(double primitiveDouble, double anotherPrimitiveDouble)
吗?