IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

contrainte de symétrie sur compareTo()


Sujet :

Langage Java

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut contrainte de symétrie sur compareTo()
    Bonjour,

    Je suis en train d'implémenter Comparable pour une de mes classes, mais les contraintes suivantes me laissent perplexe (tirées de javapractices):
    anticommutation : x.compareTo(y) is the opposite sign of y.compareTo(x)
    exception symmetry : x.compareTo(y) throws exactly the same exceptions as y.compareTo(x)
    Vu que je peut recevoir n'importe quel Object other en argument de compareTo(Object other), je n'ai absolument aucune idée de l'implémentation de compareTo() dans la classe concrète que je recois (qui peut d'ailleurs ne pas l'implémenter).

    Je pourrais lancer une erreur si la classe de other n'est pas celle de this, et espérer que other.compareTo(this) fasse la même chose; mais même là, ce n'est pas satisfaisant pour trier une Collection contenant des Object heterogènes.

    Comment suis-je censé procéder ?
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,
    L'interface comparable est "paramétré" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Interface Comparable<T>
    Ce qui veux dire que si tu veux implémenter cette interface, il faudra que tu indique avec quoi celle-ci est comparable (le T)

    Exemple d'implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package developpez;
     
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
     
    public class Toto implements Comparable<Toto> {
      public Toto(int value) {
        this.value = value;
      }
      public int value;
     
      public int compareTo(Toto anotherToto) {
        return this.value - anotherToto.value;
      }
      public static void main(String[] args) {
        List<Toto> list = new ArrayList<>();
        list.add(new Toto(7));
        list.add(new Toto(4));
        list.add(new Toto(1));
        list.add(new Toto(10));
        list.add(new Toto(9));
        list.add(new Toto(2));
        System.out.println("Avant le tri !");
        for (Toto toto : list) {
          System.out.println(toto.value);
        }
        System.out.println("Après  le tri !");
        Collections.sort(list); // sort utilise l'interface comparable pour faire le tri
        for (Toto toto : list) {
          System.out.println(toto.value);
        }
      }
    }
    L'ensemble des explications complémentaires sont données dans la documentation.

    Cordialement,
    Patrick Kolodziejczyk.

    source :
    Javadoc Comparable
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci Kolodz,

    Mais que se passe-t'il si T n'implémente pas Comparable (par exemple une super classe, voir même Object) ?
    Dans le cas d'Object, la contrainte de symétrie est impossible à satisfaire, car on ne sait pas si on recoit un Comparable ou non, et si ce comparable accepte this !

    Quel est le danger à implémenter compareTo(Object) tel que (par exemple) this.compareTo("string") soit différent de "string".compareTo(this) ?

    Je me dis naivement que si ca posait un réel problème, <T> serait déclaré <T extends Comparable>

  4. #4
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Très bonne remarque
    on a des exemples où cette symétrie n'est pas respectée ( par ex. Timestamp et Date)
    je me demande comment il faut réellement interpréter la spécification (et ce n'est pas la première fois où on trouve des specs ambiguës ...)
    en fait cette contrainte : The implementor must ensure sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) for all x and y. (This implies that x.compareTo(y) must throw an exception iff y.compareTo(x) throws an exception.)
    devrait effectivement être comprise comme x et y de type T et non pas extends T ...
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci professeur shadoko,

    en fait cette contrainte :...
    devrait effectivement être comprise comme x et y de type T et non pas extends T ...
    C'est mon sentiment aussi, alimenté par les cas "Object".

    Ce qui me gêne toutefois, c'est lorsque la relation d'ordre a du sens sur une hiérarchie de classe. Par exemple une classe abstraite Figure avec des implémentations cercle, carré... que l'on compare par surface. Dans ce cas, on a envie de respecter la contrainte sur l'ensemble des sous-types de Figure.

  6. #6
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    il me semble que l'un n'empêche pas l'autre ...
    on a ce cas avec equals : il peut être pertinent d'avoir un equals avec une instance d'une sous-classe (bon d'accord: equals est equals(Object) et n'est pas paramétrée)
    mais dans ton cas la comparaison par compareTo ne me semble pas constituer un ordre "naturel" ... il vaudrait mieux avoir un Comparator
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Oui, c'était juste un exemple inventé en 22. Un Comparator serait mieux, mais parfois on a pour contrainte d'implémenter Comparable.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. contrainte d'unicite sur deux champs
    Par mikebranque dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 17/07/2008, 16h28
  2. Contraintes de réfèrence sur MySQL ?
    Par mickdu90 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 22/12/2007, 23h17
  3. Modifier une contrainte d'intégrité sur un champ
    Par muadhib dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/11/2007, 16h54
  4. Contrainte de vérification sur champ DATE
    Par Toshtuk dans le forum Oracle
    Réponses: 12
    Dernier message: 15/09/2006, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo