《Effective Java》第12条:考虑实现Comparable接口

实现Comparable接口的好处

      当类实现了Comparable接口后,它就可以跟许多泛型算法(generic algorithm)以及依赖于该接口的集合实现(Collection implementation)进行协作.例如排序collections.sort(list,Comparable)

Comparable的约定

在下面的说明中sgn表示数学中signum函数,它根据表达式(expression)的值为负值,0,正值,分别表示-1,0,1;

  1. 实现者必须确保所有的x和y都满足sgn(x.compareTo(y)) == -sgn(y.compareTo(x));
  2. 实现者还必须保证比较关系是可以传递的,例如:(x.compareTo(y))>0&&(y.compareTo(z))>0则(x.compareTo(z))>0;
  3. 实现者必须保证,当(x.CompareTo(y))==0时;sgn(x.comoareTo(z))==sgn(y.compareTo(z));
  4. 书中还建议(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);否则将会溢出

猜你喜欢

转载自blog.csdn.net/qq_34332035/article/details/88948107
今日推荐