2

次のように書いた場合、オーバーフローの可能性はありますか?

 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

4

2 に答える 2

9

次のようなメソッドを書くべきではありません。compareTo

  • this.data = 0.5fたとえば、次の場合は失敗しますobject.data = 0.2f-おそらく正の値を返す必要がありますが、0を返します
  • の範囲をオーバーフローする可能性がありますint(その場合にJavaが何をするかさえ覚えていません。そのような状況でのキャストはほとんどの場合間違ったアプローチなので、通常は覚える必要はありません)
  • と同様の状況でint、負の数から正の数を減算し、オーバーフローのために大きな正の数を取得することになる可能性があります

十分な努力をすれば、他の厄介な状況を思いつくことができると確信しています。

幸いなことに、修正は簡単です。

return Float.compare(this.data, object.data);
于 2012-01-10T09:21:02.463 に答える
0

よほどの理由がない限り、表現エラーを最小化するdouble代わりにfloat(9 桁の係数で!) を使用しfloatます。

floatそのため、aまたは adoubleまたは anを使用するかどうかにint関係なく、どちらが機能するかを使用します。

public int compareTo(SomeObj object) {
   return Double.compare(data, object.data);
}
于 2012-01-10T09:49:23.093 に答える