2012-01-10 41 views
2

是否有溢出的潛力,如果我寫了以下內容:溢出compareTo的返回結果嗎?

public class SomeObj implements Comparable<SomeObj> { 

    private final float data; 

    public SomeObj(float data) { 
     this.data = data; 
    } 

    public int compareTo(SomeObj object) { 
     return (int) (this.data - object.data); 
    } 

} 

我見過的其他Java開發人員編寫他們compareTo方法,如我上面是怎麼做的,而不是快捷方式寫作一堆if-else聲明。如果真的存在溢出的可能性,後者是否是在這裏實施compareTo方法的最佳方法?

+0

爲什麼地球上不是'Float.compare(this.data,object.data)'?我認爲所有的原始類型都至少有這樣的比較器。 – sverre 2012-01-10 09:24:12

+1

@sverre:煩人,整數沒有得到一個直到的Java 7 :( – 2012-01-10 09:27:12

回答

9

你一定要compareTo方法是這樣的:

  • ,如果你有this.data = 0.5fobject.data = 0.2f例如它會失敗 - 大概應該返回正值,但它會返回0
  • 它可能溢出的int範圍(我甚至不記得什麼Java那樣在這種情況下,副手 - 在這種情況下鑄造幾乎總是錯誤的做法,所以我通常不需要記住)
  • 對於int類似的情況,你可以最終從負數減去一個正數,並得到一個大號由於溢出

我敢肯定,我能想到的與其他令人討厭的情況足夠的努力。

幸運的是,修復很簡單:

return Float.compare(this.data, object.data); 
0

除非你有一個很好的理由,我會用double,而不是float減少表示錯誤中的對象(由9位的因素!)使用float甚至可能不保存任何內存。

因此,我會使用哪個工作,無論你使用floatdoubleint就此事。

public int compareTo(SomeObj object) { 
    return Double.compare(data, object.data); 
}