Un problème Avec les méthodes déclarées dans Object, il y a un manque de vérification de type statique dans leur utilisation. La même chose s'applique à synchronisé, où il est courant de verrouiller le mauvais objet.
Dans ce cas, Object.equals (Object) fonctionne avec deux objets. Vous avez utilisé la collection, les paquets, au lieu d'en récupérer un élément. La question importante n'est pas de savoir comment ce bug particulier est arrivé, mais comment pouvons-nous l'empêcher de se produire en premier lieu.
Tout d'abord, utiliser les génériques et obtenir assigner chaque élément pour l'itération à un statiquement typé locale:
public int countPacks(String flavour) {
// [ The field represents a count. ]
int count = 0;
for(int index=0; index<packets.size(); ++index) {
String packet = packets.get(index);
if (packet.equals(flavour)) {
++count;
}
}
// [The error mesage was printed for each non-match.
// Even this is probably wrong,
// as it should be valid to have no packs of a valid flavour.
// Having the message in this method is actually a bit confused.]
if (count == 0) {
System.out.println("You have not entered a correct flavour");
}
return count;
}
Nous pouvons encore bien rangé ce à l'aide de la boucle améliorée. Cela semble plus clair, mais un bon programmeur connaît ses bibliothèques.
public int countPacks(String flavour) {
int count = Collections.frequency(packets, flavour);
if (count == 0) {
System.out.println("You have not entered a correct flavour");
}
return count;
}
Vous pouvez également envisager un Map<String,Integer>
au lieu de la collection.