2011-08-31 14 views
7

Java tiene un Comparator<T> para proporcionar la comparación de objetos externos a la clase en sí, para permitir los métodos múltiples/alternativos de hacer comparaciones ordenadas.Java: clase externa para determinar la equivalencia?

Pero la única manera estándar de hacer comparaciones desordenadas es para anular equals() dentro de una clase.

¿Qué debo hacer cuando deseo proporcionar comparaciones desordenadas múltiples/alternativas externas a una clase? (caso de uso obvio es el particionamiento una colección en clases de equivalencia en base a propiedades particulares.)

Suponiendo que el uso final es para la comprobación no ordenada (por ejemplo, no para la clasificación o la indexación), es que alguna vez en Aceptar para aplicar Comparator<T> que simplemente comprueba igualdad, devolviendo 0 si dos objetos son iguales, y un valor! = 0 cuando dos objetos son desiguales? (nota:. La única razón por la que no se una a esta solución, es que técnicamente se puede romper el contrato para Comparator al no proporcionar una relación que satisface la transitividad y simetría)

Parece que no debería haber sido una clase estándar EqualsComparator<T> o algo así.

(no guayaba manejar algo como esto?)

Respuesta

13

Sí, guayaba tiene la interfaz Equivalence y la clase Equivalences (Eliminado en guayaba liberar 14,0).

(Y sí, es algo, que es muy útil y muy deficiente en Java. En realidad, deberíamos tener opciones para solucionar este HashMap, HashSet etc ...)

Mientras Comparator<T> puede estar bien en En algunas situaciones, no proporciona el método hashCode que sería importante para las colecciones basadas en hash.

+0

hmmm ... ambos están etiquetados @Beta sin embargo. –

+0

@Jason: así que utilízalo con cuidado :) (En definitiva, 'Equivalence' es una interfaz, por lo que no es como si confiaras en una * implementación * que podría desaparecer). –

+5

Puedo prometer que no desaparecerá, pero está en flujo. Por ejemplo, para la versión inminente 10.0, la hemos cambiado a una clase abstracta y hemos movido la mayoría de las equivalencias directamente a ella (y probablemente terminemos el trabajo en algún momento). –

Cuestiones relacionadas