2014-10-20 63 views
3

我有這樣的方法:這是一個真正的警告或過敏皮棉?

private Boolean compare(String property, String relationOperator, 
     String operand) { 
    Integer propertyValue = NumberUtils.toInt(property); 
    Integer operandValue = NumberUtils.toInt(operand); 

    switch (relationOperator) 
    { 
     case "<": return propertyValue.compareTo(operandValue) < 0; 
     case "<=": return propertyValue.compareTo(operandValue) <= 0; 
/*WARN*/case "=": return propertyValue.compareTo(operandValue) == 0; 
     case ">=": return propertyValue.compareTo(operandValue) >= 0; 
     case ">": return propertyValue.compareTo(operandValue) > 0; 
     case "!=": return propertyValue.compareTo(operandValue) != 0; 
    } 
    return Boolean.FALSE; 
} 

對於標/*WARN*/行,FindBugs的3.0.0告訴我:

在 com.foo.MyClass.compare(字符串整數引用的可疑比較,字符串,字符串)[最可怕的(1),高 信心]

我認爲的代碼是OK,因爲我比較int不是Integer s,所以我可以在這條線上安全地@SuppressWarnings

回答

1

您的代碼很可怕,因爲它使用包裝類,並且可以使用包裝類時可以使用原語。另外,你的代碼太聰明瞭。你應該嘗試write dumb code。喜歡的東西,

private boolean compare(String property, String operator, String operand) { 
    int pv = Integer.parseInt(property); 
    int ov = Integer.parseInt(operand); 
    if (operator.equals("<")) { 
     return pv < ov; 
    } else if (operator.equals("<=")) { 
     return pv <= ov; 
    } else if (operator.equals(">")) { 
     return pv > ov; 
    } else if (operator.equals(">=")) { 
     return pv >= ov; 
    } else if (operator.equals("!=")) { 
     return pv != ov; 
    } else if (operator.equals("=") || operator.equals("==")) { 
     return pv == ov; 
    } 
    return false; 
} 
+1

謝謝,這讓警告消失。我最初選擇'Integer'來匹配使用'String.compareTo()'的現有代碼。 – 2014-10-20 03:21:52

+1

因爲Java現在支持切換「String」,所以這裏'switch'上的一串'if..else'鏈沒有任何優勢。如果需要重構,那麼將比較放到枚舉中。 – chrylis 2014-10-20 03:32:06

5

由於compareTo返回一個原語int,你是正確的,而且這段代碼很好。我建議將此作爲針對FindBugs的bug提交。

作爲一個說明,你也爲你的變量造成不必要的自動裝箱。您可以將它們存儲在int s中,並使用Integer.compare(propertyValue, operandValue)

0

我認爲的代碼是OK,因爲我比較整形不是整數,所以我可以放心地@SuppressWarnings在這條線?

我想你可以。 (我沒有看到你在做什麼本質上是不安全的。)

但是,你認爲你在比較int s是錯誤的。

您已經聲明propertyValueoperandValue作爲Integer,因此compareTo呼叫比較Integer對象。 (儘管這是一種安全的方式...)我很確定是FindBugs抱怨的。

請參閱Elliot Frisch的回答以獲得更好的編寫代碼的方法......這可能更快,而且不會刺激FindBugs。