实现Comparable接口的好处
当类实现了Comparable接口后,它就可以跟许多泛型算法(generic algorithm)以及依赖于该接口的集合实现(Collection implementation)进行协作.例如排序collections.sort(list,Comparable)
Comparable的约定
在下面的说明中sgn表示数学中signum函数,它根据表达式(expression)的值为负值,0,正值,分别表示-1,0,1;
- 实现者必须确保所有的x和y都满足sgn(x.compareTo(y)) == -sgn(y.compareTo(x));
- 实现者还必须保证比较关系是可以传递的,例如:(x.compareTo(y))>0&&(y.compareTo(z))>0则(x.compareTo(z))>0;
- 实现者必须保证,当(x.CompareTo(y))==0时;sgn(x.comoareTo(z))==sgn(y.compareTo(z));
- 书中还建议(x.compareTo(y)==0)==(x.equals(y)),但这个并不是必要的;如果违反这个条件,应该添加相应的解释
例如BigDecimal,new BigDecimal("1.0").equals.(new BigDecimal("1.00"))为false,但是二者使用compareTo是想等的.
实现Comparable小技巧
public int compareTo(PhoneNumber bn){
int areaCodeDiff = this.areaCode - bn.areaCode;
if(areaCodeDiff != 0){
return areaCodeDiff;
}
int prefixDiff = this.prefix- bn.prefix;
if(prefixDiff != 0){
return prefixDiff ;
}
return this.lineNumber - pn.lineNumber;
}
在使用这种方式实现Comparable应注意,最小和最大的可能域值之差小于或等于INTEGER.MAX_VALUE(2的31次方-1);否则将会溢出