今天来看提示十四:考虑实现Comparable
接口。
与本章讨论的其他方法不同, compareTo 方法并没有在 Object 类中声明。 相反,它是Comparable 接口中的唯一方法。 它与 Object 类的 equals 方法在性质上是相似的,除了它允许在简单的相等比较之外的顺序比较,它是泛型的。 通过实现 Comparable 接口,一个类表明它的实例有一个自然顺序(natural ordering)。一下几点是我认为的要点:
- 作者强烈推荐
(x.compareTo(y) == 0) == (x.equals(y))
,虽然这并不是必要的。但是如果没有实现这一点,对于有序集合会有问题。比如BigDecimal
的compareTo
和equals
方法就不一致,两个对象new BigDecimal("1.0")
和new BigDecimal("1.000")
在HashSet(equals)
中是不等的,在TreeSet(compareTo)
中又是相等的。 - 在 Java 7 中,静态比较方法被添加到 Java 的所有包装类中。 在 compareTo 方法中使用关系运算符「<」和「>」是冗长且容易出错的,不再推荐。同时注意不要用
+-
去比较可能会比较大的数字,比如hashCode。 - 在 Java 8 中 Comparator 接口提供了一系列比较器方法,可以使比较器流畅地构建。其中常见的有
comparingInt,comparingLong,comparingDouble
,书中还介绍了thenComparingInt 和类似的两个方法,这三个方法我倒是以前没有用过,不过一般情况下一次比较排序就够用了,不过为了保险,很多时候也会指定接下来的排序,这时候thenComparing就比较好用了。
我们系统中关于比较的需求还是很普遍的,以前没有升级jdk8的时候,我就接触了一些,当时是通过guava的库,需要定义很复杂的函数,去实现函数式编程。后来有了java8的支持,相应的开发被大大简化了,但是有些guava的库还是很好用,比如Ordering,再加上java里面原生的Comparator接口的一些支持,我们熟悉以后可以大大简化代码的复杂度。

网友评论