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

Java Discussion :

Comparaison entre 2 objets


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Points : 86
    Points
    86
    Par défaut Comparaison entre 2 objets
    Bonjour,

    je nécessite de l'aide pour comparer 2 objets, je m'explique.

    J'ai un premier objet instancier, puis l'utilisateur le modifie.
    J'aimerai savoir comment connaître quelles modifications l'utilisateur a apporté et les sauvegarder.

    Mon objet est composé d'attributs de type primitif (String, float ...) ainsi que d'objet (Polynome, Unites...)

    Actuellement j'arrive à obtenir quelque chose qui fonctionne pour mes objets mais pas pour les types primitifs, mais qui est très lourde à mon sens.

    Voilà une partie de mon code :

    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
     
    try {
    Field[] ancienAttributsCorps = //objetAvantModification;
    Field[] nouveauAttributsCorps = //objetApresModification;
    for (int i = 0; i < nouveauAttributsCorps.length; i++){			nouveauAttributsCorps[i].setAccessible(true);
    	ancienAttributsCorps[i].setAccessible(true);
     
    	if (nouveauAttributsCorps[i].get(nouveauCorps).getClass() == Polynome.class) {
                      Field[] ancienPoly = //ancien attributs du polynome
    	     Field[] nouveauPoly = // nouveau attributs du polynome
    	for (int j = 0; j < nouveauPoly.length ; j++) {
    	     [j].setAccessible(true);
    	     ancienPoly[j].setAccessible(true);
                      float ancien = (Float) ancienPoly[j]...;
    	      float nouveau = (Float) nouveauPoly[j]...
    Je vous épargne tout le reste, qui permet d'indiquer à l'utilisateur les modifications...

    Je me doute qu'il va falloir utiliser un fichier log regroupant toutes les modifications, mais avant cela j'aimerai savoir quelle amélioration dois je effectuer dans mon code.


    Merci,
    Rémy.


    Pour ceux qui veulent, voila mon code entier :
    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
    35
     
    try {
    Field[] ancienAttributsCorps = voie.getCorpsEpreuve()[corps].getClass().getSuperclass().getDeclaredFields();
    Field[] ancienAttributsGenerique = voie.getCorpsEpreuve()[corps].getClass().getSuperclass().getSuperclass().getDeclaredFields();
    Field[] nouveauAttributsCorps = nouveauCorps.getClass().getSuperclass().getDeclaredFields();
    Field[] nouveauAttributsGenerique = nouveauCorps.getClass().getSuperclass().getSuperclass().getDeclaredFields();
     
    for (int i = 0; i < nouveauAttributsCorps.length; i++){
    	nouveauAttributsCorps[i].setAccessible(true);
    	ancienAttributsCorps[i].setAccessible(true);
    	if (nouveauAttributsCorps[i].get(nouveauCorps).getClass() == Polynome.class) {
    	Field[] ancienPoly = ancienAttributsCorps[i].get(voie.getCorpsEpreuve()[corps]).getClass().getDeclaredFields();
    	Field[] nouveauPoly = nouveauAttributsCorps[i].get(nouveauCorps).getClass().getDeclaredFields();					for (int j = 0; j < nouveauPoly.length ; j++) {				nouveauPoly[j].setAccessible(true);
    	ancienPoly[j].setAccessible(true);
    									float ancien = (Float) ancienPoly[j].get(ancienAttributsCorps[i].get(voie.getCorpsEpreuve()[corps]));
    	float nouveau = (Float) nouveauPoly[j].get(nouveauAttributsCorps[i].get(nouveauCorps));
    									if(ancien != nouveau) {
    	System.out.print("\nChangement pour " + ancienPoly[j].getName() + " : " + 	ancienPoly[j].get(ancienAttributsCorps[i].get(voie.getCorpsEpreuve()[corps])) +" -> "+nouveauPoly[j].get(nouveauAttributsCorps[i].get(nouveauCorps)));
     
    }else {
    	System.out.print("\nIdentique pour " + ancienPoly[j].getName() + " : " + ancienPoly[j].get(ancienAttributsCorps[i].get(voie.getCorpsEpreuve()[corps])) +" = "+nouveauPoly[j].get(nouveauAttributsCorps[i].get(nouveauCorps)));
    									nouveauPoly[j].setAccessible(false);
    	ancienPoly[j].setAccessible(false);
    }
     
    } else {
    	if (nouveauAttributsCorps[i].get(nouveauCorps) != ancienAttributsCorps[i].get(voie.getCorpsEpreuve()[corps])) 
    {
    System.out.print("\nChangement pour " + ancienAttributsCorps[i].getName() + " : " + 	ancienAttributsCorps[i].get(voie.getCorpsEpreuve()[corps]) +" -> "+	nouveauAttributsCorps[i].get(nouveauCorps));
    } else {	System.out.print("\nIdentique pour " + ancienAttributsCorps[i].getName() + " : " + ancienAttributsCorps[i].get(voie.getCorpsEpreuve()[corps]) +" -> "+	nouveauAttributsCorps[i].get(nouveauCorps));
    		}
    	}
    nouveauAttributsCorps[i].setAccessible(false);
    ancienAttributsCorps[i].setAccessible(false);
    			}

  2. #2
    Membre confirmé
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Points : 562
    Points
    562
    Par défaut
    Bonjour,
    je ne sais pas exactement quel est ton objectif, mais s'il s'agit simplement de comparer 2 objets membre à membre, je ne vois pas trop l'intérêt de passer par l'introspection (reflexion), à moins que le nombre des membres à comparer soit vraiment important...

    C'est plus à l'objet lui même de savoir se comparer à un autre :


    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
    public class MaClasse {
    	private int member= 0;
     
    	public List<Modification>getModifications(Object newObject) {
    		List<Modification> result= new ArrayList<>();
    		if(newObject.getClass().equals(getClass())){
    			if(member!=newObject.getMember()){
    				result.add(new Modification("member",member,newObject.getMember()));
    			}
    		}
    		return result;
    	}
     
    	public int getMember() {
    		return member;
    	}
    }
    La classe gérant les modifications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Modification{
    	private String name;
    	private Object oldValue;
    	private Object newValue;
     
    	public Modification(String name,Object oldValue,Object newValue){
    		this.name=name;
    		...
    	}
    	//Accesseurs
    Ou tu peux utiliser la reflexion, mais pour faire par exemple une comparaison plus systématique de tous les membres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	public List<Modification>getModifications(Object newObject) {
    		List<Modification> result= new ArrayList<>();
    		if(newObject.getClass().equals(getClass())){
    			for (Field field : this.getDeclaredFields()) {
    				field.setAccessible(true);
    				if(field.get(this)!=null&&!field.get(this).equals(field.get(newObject)){
    					result.add(new Modification(field.getName(),field.get(this),field.get(newObject)));
    				}
    			}
    		}
    		return result;
    	}
    S'il s'agit de tracer les modifications effectuées, tu peux aussi implémenter Observable sur tes objets, et créer des messages dans les logs en cas de modifications des membres...

    Dernière chose, pour des comparaisons de valeurs non primitives, tu devrais utiliser equals plutôt que ==.

  3. #3
    Membre régulier
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Points : 86
    Points
    86
    Par défaut
    Je te remercie, c'est exactement le style de réponse que j'attendais. J'approfondirai ceci demain mais je pense qu'avec ça je serai quoi faire
    Mille merci,
    Rémy.

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

Discussions similaires

  1. Comparaison entre un objet et sa classe
    Par Diablange dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/11/2010, 18h29
  2. GLScene et les collisions entre les objets
    Par HopeLeaves dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/06/2005, 19h45
  3. comparaison entre 2 tables
    Par halina dans le forum Requêtes
    Réponses: 10
    Dernier message: 13/05/2005, 15h18
  4. Réponses: 4
    Dernier message: 25/09/2004, 09h58
  5. Réponses: 6
    Dernier message: 21/01/2004, 13h25

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