Débordant le résultat de retour pour compareTo?
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?
La solution
Vous devez certainement pas méthodes d'écriture de compareTo
comme ceci:
- Il échouera si vous avez
this.data = 0.5f
etobject.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);
}