Saltar al contenido

¿Qué debería devolver int compareTo() cuando el parámetro string es null?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *