El paso a paso o código que verás en este post es la resolución más eficiente y válida que encontramos a tus dudas o problema.
Solución:
De javadoc para Comparable
Tenga en cuenta que null no es una instancia de ninguna clase, y e.compareTo(null) debería lanzar una NullPointerException aunque e.equals(null) devoluciones
false.
Sí, no hay problema en permitir null
por ejemplo, campos, solo asegúrese de que su orden de clasificación esté definido. Lo más natural sería ponerlo antes o después de todas las cadenas reales, pero podría hacer cualquier cosa aquí, simplemente hágalo de manera consistente. (Por ejemplo, puede ordenar null
me gusta "null"
.)
Aquí hay una implementación de ejemplo para un solo miembro:
class Example implements Comparable
@Nullable
private String member;
// TODO: getter, setter, constructor, ...
public int compareTo(Example that)
if(this.member == null)
if(that.member == null)
return 0; //equal
else
return -1; // null is before other strings
else // this.member != null
if(that.member == null)
return 1; // all other strings are after null
else
return this.member.compareTo(that.member);
Tenga en cuenta que la especificación de Comparable.compareTo() solo tiene una restricción para o.compareTo(null)
(que debería comportarse como - null.compareTo(o)
es decir, lanzar una NullPointerException), pero no sobre cómo null
se manejan los campos (no menciona los campos en absoluto, por lo que una clase podría devolver lo que quiera, siempre que se garantice la antisimetría, la reflexividad y la transitividad).
Sería una mala práctica no lanzar una excepción porque viola el transitivo naturaleza antisimétrica de compareTo.
De Comparable.compareTo documentación:
El implementador debe garantizar sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) para todo x e y. (Esto implica que x.compareTo(y) debe generar una excepción si y.compareTo(x) genera una excepción).
El implementador también debe asegurarse de que la relación sea transitiva: (x.compareTo(y)>0 && y.compareTo(z)>0) implica x.compareTo(z)>0.
Finalmente, el implementador debe asegurarse de que x.compareTo(y)==0 implique que sgn(x.compareTo(z)) == sgn(y.compareTo(z)), para todo z.
Más importante aún, es una mala idea usar compareTo en sus objetos para compararlos con cadenas, por la misma razón: sign(obj.compareTo(str)) != -sign(str.compareTo(obj))
. Implemente un Comparador personalizado y haga lo que quiera en él.
Recuerda recomendar esta sección si te valió la pena.