Question

Y at-il un risque de débordement si je devais écrire ce qui suit:

 public class SomeObj implements Comparable<SomeObj> {

    private final float data;

    public SomeObj(float data) {
       this.data = data;
    }

    public int compareTo(SomeObj object) {
       return (int) (this.data - object.data);
    }

 }

J'ai vu d'autres développeurs Java écrivent leurs méthodes de compareTo comme la façon dont je l'ai fait ci-dessus comme un raccourci au lieu d'écrire un tas de déclarations de if-else. Est-ce que ce dernier soit la meilleure approche pour la mise en œuvre de la méthode de compareTo ici s'il y a vraiment un potentiel de débordement?

Était-ce utile?

La solution

Vous devez certainement pas méthodes d'écriture de compareTo comme ceci:

  • Il échouera si vous avez this.data = 0.5f et object.data = 0.2f par exemple - sans doute qui devrait renvoyer une valeur positive, mais il retournera 0
  • Il pourrait déborder la gamme de int (je ne sais même plus ce que Java fait dans ce cas, désinvolture - coulée dans une telle situation est presque toujours une mauvaise approche, donc je le fais habituellement pas besoin à retenir)
  • Pour des situations similaires avec int, vous pouvez finir par la soustraction d'un nombre positif d'un numéro de négatif et d'obtenir un grand positif nombre en raison de dépassement

Je suis sûr que je pourrais penser à d'autres situations désagréables avec un effort suffisant.

Heureusement, le correctif est facile:

return Float.compare(this.data, object.data);

Autres conseils

Sauf si vous avez une très bonne raison, j'utiliser double au lieu de float pour minimiser l'erreur de représentation (par un facteur de 9 chiffres!) Dans un objet, en utilisant peut-être pas float même enregistrer une mémoire.

En tant que tel, j'utiliser qui fonctionne si vous utilisez un float ou un double ou un int pour cette question.

public int compareTo(SomeObj object) {
   return Double.compare(data, object.data);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top