在比较器和可比较器之间选择

为了实现分类,要求被分类的对象可以或多或少地相互比较。换句话说,定义一个规则,该规则将允许任何两个对象指示给定上下文中的哪个对象更早,哪个位置更晚。

在Java中,这些规则是在对象所属的类级别定义的。例如,让我们看一个描述用户帐户的类:

UserAccount {
  currency
  value
  updatedTimestamp
}

根据上下文,可以根据不同规则比较用户帐户,例如:

  • 在应用程序中,用户将看到按货币然后按值排序的帐户;

  • 在管理面板中,所有用户帐户均按修改日期排序。

要在Java中或多或少地实现比较,有两种可能性:

  • UserAccount实现此接口,Comparable<UserAccount>在这种情况下,两个对象可以相互比较:acc1.compareTo(acc2)

  • 创建一个单独的类来实现interface Comparator<UserAccount>,然后该类的对象可以将原始类的两个对象彼此进行比较:userAccountComparator.compare(acc1, acc2)

显然,在某些情况下,可比和比较器之间没有选择。如果无法修改原始类,或者需要不同的比较规则,则必须使用Comparator。否则,您可以在技术上同时使用Comparator和Comparable。

Comparable , (class's natural ordering). , (String, Date). , . , . ( BigDecimal , 4.0 4.00?). , "" . Comparable.

. , . . : . :

  • : Arrays.sort(accountsList)

  • : Arrays.sort(accountsList, accountByValueComparator)

, compareTo UserAccount, - accountByValueComparator. . .

UserAccount implements Comparable<UserAccount> {
  @Override
  public int compareTo(UserAccount other) { .. }
}

, compareTo ? , Comparable#compareTo, Arrays.sort(). jdk, . : UserAccount Arrays.sort(), stream.sorted() .

在显式传递比较器的情况下,找到其使用是微不足道的。我以此为理由使用比较器。(Equals / hashCode是难以找到隐式用法的另一个示例,但没有“ Equalator”替代方法)。

总之,在大多数情况下,使用Comparator的参数胜过使用Comparable的参数。




All Articles