如果我写下以下内容,是否有可能出现溢出:
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 :(得分:9)
你绝对应该不写这样的compareTo
方法:
this.data = 0.5f
和object.data = 0.2f
,则会失败 - 可能会返回正值,但会返回0 int
的范围(我甚至不记得Java在这种情况下做了什么,在这种情况下,在这种情况下投射几乎总是错误的方法,所以我通常不会需要记住)int
的类似情况,您最终可以从负数中减去正数,并因溢出而获得大的正数我确信我能用足够的努力想出其他令人讨厌的情况。
幸运的是,修复很简单:
return Float.compare(this.data, object.data);
答案 1 :(得分:0)
除非你有充分的理由,否则我会使用double
代替float
来最小化表示错误(乘以9位!)在一个对象中,使用float
可能甚至没有保存任何记忆。
因此,无论您使用float
还是double
还是int
,我都会使用哪种方式。
public int compareTo(SomeObj object) {
return Double.compare(data, object.data);
}