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 :

Identifiant unique d'un objet


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut Identifiant unique d'un objet
    Bonjour,

    J'ai une classe dont j'ai surchargé le equals pour éviter des doublons par exemple. Seulement, je me retrouve à avoir besoin de différentier deux objets au sens stricte. Je m'explique : je veux faire une map qui associe une valeur différente pour des instances qui peuvent être "égales" au sens de ma surcharge... Je précise que j'ai aussi surchargé hasCode...

    Donc, savez-vous si l'on peut retrouver l'id unique d'un objet? Comme ça je m'en servirais comme clef pour ma map.

    Merci d'avance


    PS : mon cas est peut être tordu, mais d'une mes surcharges de equals et hasCode sont maintenant nécessaires, et de deux la réponse à la question m'intéresse, même si ce n'est pas une bonne solution à mon problème.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Un objet n'a pas d'ID unique.

    Dans les spec, c'est spécifié qu'une instance n'est égale a une autre instance que si elles pointent sur le même objet.

    Concernant le hashCode, c'est unique avec des pincettes apparemment :

    As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
    Si tu as surchagée equals() et hashcode() le seul moyen que je vois et de gérer un ID unique toi même, avec un compteur statique que tu incrémentes a chaque nouvelle création.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    identityHashCode sur system renvoie le hashcode de Object: http://java.sun.com/j2se/1.4.2/docs/...a.lang.Object)

    Sinon, pour comparer deux instances du point de vue de leur instance, suffit de faire if (x != y), çà compare les instance, pas le contenu.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur full-stack
    Inscrit en
    Mai 2002
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur full-stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 46
    Par défaut
    Bonjour,

    Je n'ai rien à ajouter à la réponse donnée par tchize_

    Juste une petite remarque pour les lecteurs que ça interresserait:

    Redéfinir equals et hashcode n'est pas suffisant pour éviter les doublons.
    Il faut en plus être sûr que tout le code (son propre code + APIs) qui manipule ces objets ne fait pas de "==".
    Une meilleure solution à mon sens lorsque c'est possible est d'interdire la création des doublons.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Merci tchize_, identityHashCode marche pour mon cas!

    Alors, finalement, cet attribut est bien unique pour tout objet dans une JVM?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non malheureusement identityHashcode te retourne le hashcode suivant le meme algorithme que Object.hashCode, comme déjà mentionné, la jvm "tente" de rendre ce code unique pour chaque objet, ce n'est pas une garantie!

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Par défaut Voici un exemple
    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
    class HashClash {
        public static void main(String[] args) {
             final Object obj = new Object();
             final int target = obj.hashCode();
             Object clash;
             long ct = 0;
             do {
                 clash = new Object();
                 ++ct;
             } while (clash.hashCode() != target && ct<10L*1000*1000*1000L);
             if (clash.hashCode() == target) {
                 System.out.println(ct+": "+obj+" - "+clash);
             } else {
                 System.out.println("No clashes found");
             }
        }
    }
    En une dizaines de seconde j'ai mon premier clash
    37240305: java.lang.Object@10b62c9 - java.lang.Object@10b62c9

    zovi22

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2006, 11h34
  2. Trouve l'identifiant unique du dernier enregistrement créé.
    Par Poussy-Puce dans le forum Requêtes
    Réponses: 4
    Dernier message: 12/01/2006, 14h46
  3. [fichier] trouver un identifiant unique
    Par FFF dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 16/10/2005, 23h51
  4. [DB2] Identifiant unique
    Par kluh dans le forum DB2
    Réponses: 1
    Dernier message: 24/05/2005, 12h20
  5. l'identifiant unique de la dernière ligne insérée
    Par dim_italia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2004, 17h55

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