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甚至可能不会节省任何内存。

因此,无论您使用 afloat或 adouble还是 an int,我都会使用 which works 。

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