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

avec Java Discussion :

Constructeur de copie ?


Sujet :

avec Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2003
    Messages : 88
    Points : 59
    Points
    59
    Par défaut Constructeur de copie ?
    Bonjour,

    J'ai une question de debutant :
    Je souhaite construire un objet a partir d'un objet de meme type. Prenons l'exemple d'un objet voiture.
    Est'il possible d'utiliser une fonction de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Voiture(Voiture v) {
    this = v;
    }
    Pour le moment j'utilise une methode qui copie un a un les attributs de l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Voiture(Voiture v) {
    this.moteur = v.moteur;
    this.roue = v.roue
    etc ...
    }
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    La première solution n'est pas possible. Il faut copier les attributs un à un, ou utiliser le mécanisme de cloneage de Java :
    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
    public class Voiture implements Cloneable {
     
    	// ...
     
    	@Override
    	public Voiture clone() {
    		try {
    			return (Voiture) super.clone();
    		} catch (CloneNotSupportedException e) {
    			// Ceci ne devrait pas arriver si on implémente Cloneable
    			// mais au cas où on remonte une exception 'unchecked' :
    			throw new IllegalStateException(e);
    		}
    	}
     
    }
    Attention toutefois car le cloneage se contente de recopier la référence des objets (tout comme l'affectation des attributs de ton second constructeur). Donc s'il s'agit d'objet modifiable les modifs impacteront les deux instances de Voiture...

    Si on veux éviter cela on doit cloner récursivement les attributs ou les recréer...

    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non, le this=v n'a aucun sens.
    La copie d'attribut est la méthode recommandée.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2003
    Messages : 88
    Points : 59
    Points
    59
    Par défaut
    Ok, merci pour vos reponses

    Est'il possible d'inclure un appel au constructeur de copie dans le constructeur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Voiture(Object objet) {
     super();
     if (objet instanceof Voiture) {
        Voiture ((Voiture) objet );
     }
     [...]
    }
     
    public Voiture(Voiture v) {
      this.moteur = v.moteur;
      this.roue = v.roue;
      [...]
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non car la délégation à un autre constructeur ne peut se faire que dans la première instruction du constructeur.

    Tu peux par contre très bien déplacer ton code de copie dans une méthode privée que t'appelle depuis tous les constructeur qui en ont besoin.

    Enfin, dans ton cas précis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Voiture {
        public Voiture(Object o){if (o instanceof Voiture) init((Voiture)o);}
        public Voiture(Voiture v){init(v);}
    }
    .....
    Voiture v = new Voiture("ma voiture");
    Voiture v2 = new Voiture(v);
    Ce sera direct le deuxième constructeur qui sera appelé pour construire v2, donc pas besoin de chipoter avec le instanceof, java comme tous les language objet, fait appel aux bonne méthodes suivant le type déclaré des paramettre (j'ai bien dit déclaré, pas effectif)

  6. #6
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2003
    Messages : 88
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    non car la délégation à un autre constructeur ne peut se faire que dans la première instruction du constructeur.

    Tu peux par contre très bien déplacer ton code de copie dans une méthode privée que t'appelle depuis tous les constructeur qui en ont besoin.

    Enfin, dans ton cas précis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Voiture {
        public Voiture(Object o){if (o instanceof Voiture) init((Voiture)o);}
        public Voiture(Voiture v){init(v);}
    }
    .....
    Voiture v = new Voiture("ma voiture");
    Voiture v2 = new Voiture(v);
    Ce sera direct le deuxième constructeur qui sera appelé pour construire v2, donc pas besoin de chipoter avec le instanceof, java comme tous les language objet, fait appel aux bonne méthodes suivant le type déclaré des paramettre (j'ai bien dit déclaré, pas effectif)
    Merci pour ta reponse.
    Evidemment, creer une methode privee semble etre la meilleure solution.

    Par contre j'ai pas compris ton allusion a déclaré/effectif => effectif, ce sont ceux qui sont utlises a l'interieur de la methode, contrairement aux parametres declares qui sont dans l'entete de la methode ??

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Sylk Voir le message
    Par contre j'ai pas compris ton allusion a déclaré/effectif
    Object o = new Voiture();
    o est déclaré comme une variable de type objet, si tu passe o en paramètre à une méthode / constructeur, c'est sur le type "Object" que java se basera pour déterminer le méthode à appeler quand plusieurs méthodes de même non sont possibles.

    Mais dans les fait, à ce moment là, o est de type Voiture.

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

Discussions similaires

  1. [résolu]les constructeurs de copie
    Par pouss dans le forum Langage
    Réponses: 9
    Dernier message: 28/06/2005, 10h57
  2. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  3. [C++]Heritage et constructeur de copie
    Par matazz dans le forum C++
    Réponses: 2
    Dernier message: 25/03/2005, 12h31
  4. Constructeur de copie modifiant le paramètre ?
    Par Nicodemus dans le forum C++
    Réponses: 4
    Dernier message: 12/01/2005, 21h25
  5. Constructeur de copie et Template: Transtypage
    Par ikkyu_os dans le forum Langage
    Réponses: 9
    Dernier message: 26/12/2004, 22h29

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