2 votes

2 méthodes compareTo surchargées dans la même définition de classe, comment puis-je forcer l'utilisation de la seconde ?

Je veux trier une liste List<Blabla> donnees par un critère sur un de ses champs. Mon problème est que compareTo est déjà surchargé pour cette classe. J'ai donc quelque chose comme :

Blabla {

    public int compareTo(Object other) {
        ...
     }

    public int compareTo(Blabla other) {
        ... 
     }

}

Dans une classe de couche métier, j'appelle :

Business {
   method (){
       Collections.sort(List<Blabla > donnees);
   }

}

Mais cet appel à la méthode N°1 compareTo avec un paramètre objet. Comment pourrais-je trier ma liste avec la méthode N°2 ?

Il s'agit d'une application ancienne et volumineuse, je ne connais pas les effets secondaires d'une modification de la méthode N°1compareTo, c'est pourquoi je veux ajouter une autre méthode compareTo (ou autre) au lieu de modifier la première.

4voto

niksvp Points 3218

Utilice Comparateur au lieu de Comparable .

Il vous permettra d'utiliser autant de méthodes différentes que vous le souhaitez pour comparer.

0voto

BoffinbraiN Points 1854

Je pense que la réponse à la question de savoir pourquoi vous finissez par appeler la compareTo(Object) au lieu de la méthode spécifique est parce que votre définition de classe dit implements Comparable (sans aucun paramètre de type). Sans type générique, tout type comme T sera par défaut Object .

Il existe plusieurs solutions à ce problème. La première a déjà été recommandée par d'autres personnes et consiste à fabriquer votre propre carte de crédit personnalisée. Comparator<Blabla> et de les utiliser dans vos méthodes de tri. Comme ces comparateurs sont des objets distincts, ils n'interfèrent pas avec le comportement de la classe existante. Prenons l'exemple de ces comparateurs, sur une certaine classe Person qui a getName() y getAge() méthodes. Vous pouvez en créer autant que vous le souhaitez.

public class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }
}

public class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

Après avoir obtenu ce résultat, vous pouvez décider si vous souhaitez ou non modifier votre classe d'origine pour qu'elle implémente correctement Comparable<Blabla> . À ce moment-là, vous retirez le compareTo(Object) entièrement et garder l'autre. Lorsque vous compilez, ou lorsque vous enregistrez dans votre IDE, vous découvrirez alors tous les endroits où cet objet est référencé en tant que Comparable sans type, et ils seront affichés comme des avertissements ou des erreurs de compilation. C'est alors à vous de décider comment corriger le code dans chaque cas. Cela dépend en grande partie de ce que le compareTo(Object) fait différemment de la méthode compareTo(Blabla) méthode. S'il fait explicitement un instanceof vérifier et/ou couler directement vers le type Blabla alors la conversion devrait être sûre à 100 %, car cela signifie que tout le code existant doit l'utiliser correctement si vous ne rencontrez jamais de problème avec la conversion. ClassCastException au moment de l'exécution.

-1voto

dko Points 478

Dans la fonction CompareTo(Object other), il y a une instruction if qui dit

`if(other instanceof Blabla) Return compareTo((Blabla)other)`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X