Escolha entre comparador e comparável

Para implementar a classificação, é necessário que os objetos sendo classificados possam ser comparados entre si por mais ou menos. Em outras palavras, para definir uma regra que permitirá que quaisquer dois objetos indiquem qual deles dentro do contexto dado vai antes e qual vai depois.

Em java, essas regras são definidas no nível das classes às quais os objetos pertencem. Por exemplo, vamos dar uma aula para descrever a conta de um usuário:

UserAccount {
  currency
  value
  updatedTimestamp
}

Dependendo do contexto, as contas de usuário podem ser comparadas de acordo com regras diferentes, por exemplo:

  • no aplicativo, o usuário vê as contas classificadas por moeda e depois por valor;

  • no painel de administração, todas as contas de usuário são classificadas por data de modificação.

Para implementar a comparação de mais ou menos em java, existem duas possibilidades:

  • UserAccount implementa a interface. Comparable<UserAccount>Nesse caso, dois objetos podem ser comparados:acc1.compareTo(acc2)

  • Uma classe separada é criada para implementar a interface Comparator<UserAccount>e, em seguida, o objeto dessa classe pode comparar dois objetos da classe original entre si:userAccountComparator.compare(acc1, acc2)

Obviamente, em alguns casos, não há escolha entre Comparável e Comparador. Se a classe original não puder ser modificada ou se regras de comparação diferentes forem necessárias, um Comparador deve ser usado. Caso contrário, você pode tecnicamente usar Comparador e Comparável.

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() .

No caso de passar explicitamente um comparador, descobrir seu uso é trivial. Eu vejo isso como um argumento para usar um comparador. (Equals / hashCode é outro exemplo de dificuldade em encontrar usos implícitos, mas não há alternativa "Equalator" para eles).

Em resumo, na maioria dos casos, os argumentos para usar o Comparator superam os argumentos para usar o Comparable.




All Articles