Elegir entre Comparador y Comparable

Para implementar la clasificación, se requiere que los objetos que se clasifican se puedan comparar entre sí durante más o menos. En otras palabras, definir una regla que permitirá que dos objetos cualesquiera indiquen cuál de ellos dentro del contexto dado viene antes y cuál después.

En java, estas reglas se definen al nivel de las clases a las que pertenecen los objetos. Por ejemplo, tomemos una clase para describir la cuenta de un usuario:

UserAccount {
  currency
  value
  updatedTimestamp
}

Según el contexto, las cuentas de usuario se pueden comparar de acuerdo con diferentes reglas, por ejemplo:

  • en la aplicación, el usuario ve las cuentas ordenadas por moneda y luego por valor;

  • en el panel de administración, todas las cuentas de usuario están ordenadas por fecha de modificación.

Para implementar la comparación de más o menos en java, hay dos posibilidades:

  • UserAccount implementa la interfaz Comparable<UserAccount>En este caso, dos objetos tienen la capacidad de compararse entre sí:acc1.compareTo(acc2)

  • Se crea una clase separada que implementa la interfaz Comparator<UserAccount>, y luego el objeto de esta clase puede comparar dos objetos de la clase original entre sí:userAccountComparator.compare(acc1, acc2)

Obviamente, en algunos casos, no se puede elegir entre Comparable y Comparator. Si la clase original no se puede modificar, o si se requieren diferentes reglas de comparación, se debe utilizar un Comparador. De lo contrario, técnicamente puede utilizar Comparator y 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() .

En el caso de una transferencia explícita de un comparador, encontrar su uso es elemental. Veo esto como un argumento para usar un comparador. (Equals / hashCode es otro ejemplo de dificultad para encontrar usos implícitos, pero no existe una alternativa "Equalator" para ellos).

En resumen, en la mayoría de los casos, los argumentos para usar Comparator superan a los argumentos para usar Comparable.




All Articles