我有一个方法需要两个Doubles
a
和b
(注意大写'D')并计算差异。如果只有一个参数是null
,则结果应为999999
,否则将返回两个数字之间的差异。
以下(工作)代码在FindBugs中给出了一个“可怕”警告,我通常会尝试避免代码中的高级别警告。但是,我认为代码既简短又易读,而我能想到的其他一切只会降低其可读性。使用==
的恕我直言在此案例中完全正确。
public double foo(Double a, Double b) {
return a == b ? 0 : (a != null && b != null) ? b - a : 999999;
}
该行的FindBugs报告:
Bug:可疑的双引用比较 Main.foo(双人,双人)
此方法使用==或!=运算符比较两个参考值, 通常情况下,比较这种类型的实例的正确方法 使用equals()方法。可以创建不同的实例 这是相同的,但不作为==进行比较,因为它们是不同的 对象。一般不应该比较的类的例子 引用是java.lang.Integer,java.lang.Float等。
信心:高,等级:最可怕(1)模式:RC_REF_COMPARISON类型: RC,类别:正确(正确性)
任何想法如何在没有警告的情况下干净简单地重写此代码?
答案 0 :(得分:3)
我建议采取更多步骤来做同样的事情,从长远来看易于维护
public double foo(Double a, Double b) {
//as per Marco suggestion. but not sure OP wants the same.
if(a == null && b == null){
return 0;
}
//END
if(a == null || b == null){
return 999999;
}
return b-a; //will return 0 if they are equal. no extra checks required
}
答案 1 :(得分:2)
==
检查两个引用是否引用相同的对象。但是,你必须检查两者是否具有相同的值。因此,请使用.equals()
方法
public double foo(Double a, Double b) {
return (a != null && a.equals(b)) ? 0 : (a != null && b != null) ? b - a : 999999;
}
答案 2 :(得分:2)
......以及我能想到的其他一切只会降低其可读性
根据您是否更喜欢可读性而不是正确性,您可以考虑
public double foo(Double a, Double b)
{
if (a == null)
{
if (b == null)
{
return 0;
}
return 999999;
}
if (b == null)
{
return 999999;
}
return b - a;
}
BTW:这999999
看起来很可疑。也许这应该是Double.POSITIVE_INFINITY
或Double.MAX_VALUE
左右,但确定它取决于预期用途。
答案 3 :(得分:1)
这样怎么样:
public static void main(String[] args) {
print(null, null);
print(5.0, null);
print(null, 2.0);
print(5.0, 2.0);
}
public static void print(Double a, Double b) {
System.out.printf("a=%f, b=%f result=%f\n", a, b, foo(a, b));
}
public static double foo(Double a, Double b) {
return a == null
? b == null ? 0 : 9999
: b == null ? 9999 : b - a;
}
输出:
a=null, b=null result=0.000000
a=5.000000, b=null result=9999.000000
a=null, b=2.000000 result=9999.000000
a=5.000000, b=2.000000 result=-3.000000