我希望了解这种看似不一致的地方:
Comparator.compare将两个对象作为输入参数进行比较并对它们进行比较,而不是对this
执行任何操作。为什么它不能成为静态方法?
Comparator.equals将另一个对象作为输入参数,并将其与this
进行比较。
为什么设计范式存在差异?为什么compare
只询问一个Object参数并将其与此进行比较?
答案 0 :(得分:2)
Comparator.equals()
的实现将覆盖Object.equals()
,并且应该将 Comparator
本身与另一个Comparator
进行比较。因此,它与Comparator.compare()
无关,{{1}}应该比较另一种类型的两个对象。
参见Chetan Kinger关于静态部分的答案。
答案 1 :(得分:1)
等于将此比较器与另一个比较器进行比较。 比较涉及泛型参数类型的两个值。
假设您将使用静态功能制作自己的比较API。然后你可以传递一个Java 8"函数。"
myCollection.mySort(MyComparator::compare);
然后用一些额外的标准来制作一个参数化的比较器是很困难的。静态字段在多线程系统中是不可行的。
但是,您可能喜欢可组合比较器的java 8构建器模式
Comparator<Employee> fullNameComparator =
Comparator.comparing(Employee::getLastName)
.thenComparing(Employee::getFirstName);
employees.sort(fullNameComparator);
答案 2 :(得分:0)
Comparator允许给定类的无限数量的可能实现。例如,这允许您按照许多不同的标准对列表进行排序。
假设您有一份员工列表。您可以使用按工资排序的比较器和按名称排序的另一个比较器。
从Object重写equals()方法。这种设计允许类实现者指定两种实例被认为相等的唯一方式。请注意,为专门用作比较器的类重写equals()会有点不寻常。
答案 3 :(得分:0)
虽然Sotirios的答案是正确的,但比较器也像一个外部&#34;工具&#34;比较&#34;事物&#34; (两个对象),因此将比较器引用给自身没有任何意义(&#34;这个&#34;引用)。想象一下比较器作为一对比例尺:它不会测量自身,而是测量两个不同的物体重量。
对于&#34;这个&#34;引用你必须实现另一个接口Comparable,它更类似于内置的Object&#34; equals&#34;。
答案 4 :(得分:0)
为什么它不能成为静态方法?
无法覆盖static
方法。如果compare
中的Comparator
方法是静态的,那么实现Comparator
的类就无法定义自己的比较策略。此外,static
方法实际上不是Comprator
接口合同的一部分。 (Java 8允许接口具有静态方法)
为什么不比较只要求一个Object参数和比较 它到这个
Comparator
的目的是允许您定义一个或多个不是类的自然比较策略的比较策略。理想情况下,Comparator
必须由与其定义比较策略的类不同的类实现。因此,Comparator
依赖于它定义比较策略的类的this
引用是没有意义的。如果要为类定义自然比较策略,则可以实现Comparable
。 Comparable
有一个compareTo
方法,可以在this
上运行,因此只需要一个参数。
答案 5 :(得分:0)
Comparator.compare将两个对象作为输入参数进行比较并对它们进行比较,而不是对此进行任何操作。为什么它不能成为静态方法?
它可能是静态的,但这会阻止您将比较函数作为参数传递给其他函数。因为函数不是Java中的一等公民,所以你必须用一个接口来包装那个单一的函数,以使它可以通过。
Comparator.equals将另一个对象作为输入参数并将其与此进行比较。 为什么设计范式存在差异?为什么不比较只要求一个Object参数并将其与此进行比较?
equals
方法,用于查看当前比较器是否等于其他比较器,而不是用于比较任意对象。