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 :

Problème d'instanciation d'objet


Sujet :

avec Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Problème d'instanciation d'objet
    J'ai une classe Facture qui a comme champs un vecteur remplit par un objet de classe Article que je n'arrive pas a bien faire avec le constructeur de la classe Factures

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    //classe article
    class Article{
    	private String nomarticle ;
    	private double prixunitaire ;
    	private double quantite ;
    //constructeur	
    	public Article (String nomarticle , double prixunitaire , double quantite) {
     
    	  this.nomarticle   = nomarticle ;   
    	  this.prixunitaire = prixunitaire;
    	  this.quantite     = quantite;
        }
        //constructeur
     
        public Article(){
     
        }
     
        public String getNomarticle() { 
        	return nomarticle ; 
        }
     
        public double getPrixunitaire() {
            return prixunitaire ;
        }
     
        public double getQuantite() {
            return quantite ;
        }
     
        public void setNomarticle(String nouvNomarticle) { 
       	    nomarticle = nouvNomarticle ; 
        }
     
        public void setPrixunitaire(double nouvPrixunitaire) { 
       	    prixunitaire = nouvPrixunitaire ; 
        }
     
        public void setQuantite(double nouvQuantite) { 
       	    quantite = nouvQuantite ; 
        }
     
    //affichage des informations    
         public void afficher() {
     
    	         System.out.println("nom de l'article        : " + getNomarticle());
    		     System.out.println("Prix unitaire           : " + getPrixunitaire());
    		     System.out.println("quantite                : " + getQuantite());
     
    		     }
     
     
    }
     
    class Factures {
        	private double montant ;
        	private Clien  nomClient ;
        	private String naturePayement ;
        	private Vector<Article> Art = new Vector<Article> ();
     
        	public Factures (double montant,String nom,String prenom,String numTel ,String codeCivic,String codePos,String pays ,String naturePayement,
        		             String nomarticle , double prixunitaire , double quantite){
     
        		this.montant         = montant ;
        		this.nomClient       = new Clien(nom , prenom, numTel , codeCivic, codePos, pays) ;
        		this. naturePayement = naturePayement ;
        		this.Art             = Art = new Vector<Article> ();// Art(nomarticle,prixunitaire,quantite);
        	}
        	//String nomarticle , double prixunitaire , double quantite
        	public void setArticle(){
        		Art.add(new Article(nomarticle , prixunitaire , quantite));
        	}
        	public double getMontant() {
            return montant ;
            }
     
            public void setMontant(double nouvMontant) { 
       	    montant = nouvMontant ;
            } 
     
     
        	public String getNaturePayement() {
            return naturePayement ;
            }
     
            public void setNaturePayement(String nouvNaturePayement) { 
       	    naturePayement = nouvNaturePayement ;
            } 
     
            public void afficher() {
     
        	 DecimalFormat monnaie = new DecimalFormat("0.00") ;
     
    	     System.out.println("Montant            :" + monnaie.format(montant) + "\n");
    	     System.out.println("Nature du payement : " + naturePayement + "\n");
     
    	     nomClient.afficher();
     
     
    	     System.out.println();
           }
        }
    merci d'avance

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Salut,

    Tu as tout d'abord quelques incohérences dans ton constructeur Factures:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Factures (double montant,String nom,String prenom,String numTel ,String codeCivic,String codePos,String pays ,String naturePayement,
        		             String nomarticle , double prixunitaire , double quantite){
     
        		this.montant         = montant ;
        		this.nomClient       = new Clien(nom , prenom, numTel , codeCivic, codePos, pays) ;
        		this. naturePayement = naturePayement ;
        		this.Art             = Art = new Vector<Article> ();// Art(nomarticle,prixunitaire,quantite);
        	}
    La dernière ligne du constructeur est inutile.
    Ton client est écrit "Clien"
    Les paramètres nomarticle, prixunitaire et quantite ne sont pas utilisés. Tu peux donc les retirer sans soucis.

    Le problème vient surtout de ta ligne 72:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setArticle(){
        		Art.add(new Article(nomarticle , prixunitaire , quantite));
        	}
    En effet ton setter ne prend aucun paramètre et tu lui demande ensuite d'ajouter un article avec des paramètres sortis du chapeau.
    De plus j'utiliserais un "int" pour le paramètre "quantite", car la quantité est sans doute un entier.

    Je ne sais pas quel est ton environnement de travail, mais il doit t'afficher des erreurs! Tu peux les lire, c'est fait pour ça!
    Voici ce que je ferais à ta place:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Factures (double montant,String nom,String prenom,String numTel ,String codeCivic,String codePos,String pays ,String naturePayement){
     
        		this.montant         = montant ;
        		this.nomClient       = new Client(nom , prenom, numTel , codeCivic, codePos, pays) ;
        		this. naturePayement = naturePayement ;
        	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setArticle(String nomarticle, double prixunitaire, int quantite){
        		Art.add(new Article(nomarticle , prixunitaire , quantite));
        	}

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 49
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Je pense justement qu'il a mit prixUnitaire, quantité, nomArticle dans le constructeur pour ne pas faire de facture "vide". Si c'est le cas t'as juste a faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Factures (double montant,String nom,String prenom,String numTel ,String codeCivic,String codePos,String pays ,String naturePayement,
        		             String nomarticle , double prixunitaire , double quantite){
     
        		this.montant         = montant ;
        		this.nomClient       = new Clien(nom , prenom, numTel , codeCivic, codePos, pays) ;
        		this. naturePayement = naturePayement ;
        		this.Art.add(new Article(nomarticle , prixunitaire , quantite));
    Tu peux mettre également le constructeur de RomSupSup, car pour moi une facture "vide" n'est pas choquante en soit. Ce qui te fait que tu pourra instancier une facture vide ou une facture ayant déjà des articles

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut getters et setters
    Bonjour,

    Je réponds à ton post, non pas pour te donner une réponse mais pour amener une critique constructive à un élément de ton code. Je suis actuellement en formation à l'AFPA et je viens de voir dans ton code un façon de coder qui correspond à une question que j'ai posée aujourd'hui en cours

    C'est au sujet du constructeur de la classe Article. Tu as codé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Article{
    	private String nomarticle ;
    	private double prixunitaire ;
    	private double quantite ;
    //constructeur	
    	public Article (String nomarticle , double prixunitaire , double quantite) {
     
    	  this.nomarticle   = nomarticle ;   
    	  this.prixunitaire = prixunitaire;
    	  this.quantite     = quantite;
        }
    Tu as déclaré des attributs en private et créé des getters et des setters. jusque là, rien d'anormal.
    Par contre, dans ton constructeur, tu n'utilise pas les setters puisque tu a codé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	  this.nomarticle   = nomarticle ;   
    	  this.prixunitaire = prixunitaire;
    	  this.quantite     = quantite;
    . Si tu avais utilisé les setters, tu aurais codé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Article{
    	private String nomarticle ;
    	private double prixunitaire ;
    	private double quantite ;
    //constructeur	
    	public Article (String nomarticle , double prixunitaire , double quantite) {
     
    	  setNomarticle(nomarticle);  
    	  setPrixunitaire(prixunitaire);
    	  setQuantite(quantite);
        }
    Alors, ta méthode n'est pas fausse mais mon prof m'a répondu ceci en préférant l'utilisation des setters dans le constructeur :

    Si par exemple tu dois compter combien de fois un attribut a été modifié, ou si tu veux simplement mettre une trace de debug dans le setter, à chaque fois que tu vas instancier un article, tu n'aura pas le compte ou la trace de la modif de l'attribut.
    Donc il vaut mieux préférer soit une méthode, soit l'autre. Et comme tu as mis des setters en place (obligé puisque private ...) le mieux serait de les utiliser.

    Voilà,
    OS : LinuxMint 20

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par francky74 Voir le message
    Alors, ta méthode n'est pas fausse mais mon prof m'a répondu ceci en préférant l'utilisation des setters dans le constructeur :

    Si par exemple tu dois compter combien de fois un attribut a été modifié, ou si tu veux simplement mettre une trace de debug dans le setter, à chaque fois que tu vas instancier un article, tu n'aura pas le compte ou la trace de la modif de l'attribut.
    Donc il vaut mieux préférer soit une méthode, soit l'autre. Et comme tu as mis des setters en place (obligé puisque private ...) le mieux serait de les utiliser.
    Malheureusement cela est très discutable.

    En général les getters et setters sont redéfinissables par les sous-classes.
    Or si on redéfinit une méthode appelée par le constructeur d'une classe mère, cela signifie que la méthode de la classe fille s'exécute avant que le constructeur de la classe mère ne soit terminé, et avant même que l'initialisation de la classe fille n'ait commencé. Ce qui est contraire aux règles d'encapsulation, et en général mécompris et source de bugs.

    Il vaut mieux éviter, dans un constructeur, d'appeler des méthodes qui peuvent être redéfinies.
    (Par contre, si les getters/setters sont finaux, là ça se tient.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour voici la solution que je te propose :

    Classe Client
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
    public class Client {
     
    	String nom;
    	String prenom;
    	String tel; //renommage
    	String codeCivic; // je ne sais pas si tu t'en sers
    	String rue; // ajout 
    	String codePostal; //renommage
    	String ville; //ajout 
    	String pays;
     
    	//constructeurs
     
    	public Client(){
     
    	}
     
    	public Client(String nom,String prenom,String tel ,String codeCivic,String rue, String codePostal,String ville, String pays){
    		this.nom = nom;
    		this.prenom = prenom;
    		this.tel = tel;
    		this.codeCivic = codeCivic;
    		this.rue = rue;
    		this.codePostal = codePostal;
    		this.ville = ville;
    		this.pays = pays;
    	}
     
    	//tes methodes persos
     
    	public void afficher(){
     
     
    	}
     
    	// les getters et setters qui vont bien
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public String getPrenom() {
    		return prenom;
    	}
     
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
     
    	public String getTel() {
    		return tel;
    	}
     
    	public void setTel(String tel) {
    		this.tel = tel;
    	}
     
    	public String getCodeCivic() {
    		return codeCivic;
    	}
     
    	public void setCodeCivic(String codeCivic) {
    		this.codeCivic = codeCivic;
    	}
     
    	public String getCodePostal() {
    		return codePostal;
    	}
     
    	public void setCodePostal(String codePostal) {
    		this.codePostal = codePostal;
    	}
     
    	public String getVille() {
    		return ville;
    	}
     
    	public void setVille(String ville) {
    		this.ville = ville;
    	}
     
    	public String getPays() {
    		return pays;
    	}
     
    	public void setPays(String pays) {
    		this.pays = pays;
    	}
     
     
    	//hashCode() et equals() si le nom, prénom et adresse sont égaux entre 2 clients alors ce sont la même personne.
     
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result
    				+ ((codePostal == null) ? 0 : codePostal.hashCode());
    		result = prime * result + ((nom == null) ? 0 : nom.hashCode());
    		result = prime * result + ((pays == null) ? 0 : pays.hashCode());
    		result = prime * result + ((prenom == null) ? 0 : prenom.hashCode());
    		result = prime * result + ((rue == null) ? 0 : rue.hashCode());
    		result = prime * result + ((ville == null) ? 0 : ville.hashCode());
    		return result;
    	}
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Client other = (Client) obj;
    		if (codePostal == null) {
    			if (other.codePostal != null)
    				return false;
    		} else if (!codePostal.equals(other.codePostal))
    			return false;
    		if (nom == null) {
    			if (other.nom != null)
    				return false;
    		} else if (!nom.equals(other.nom))
    			return false;
    		if (pays == null) {
    			if (other.pays != null)
    				return false;
    		} else if (!pays.equals(other.pays))
    			return false;
    		if (prenom == null) {
    			if (other.prenom != null)
    				return false;
    		} else if (!prenom.equals(other.prenom))
    			return false;
    		if (rue == null) {
    			if (other.rue != null)
    				return false;
    		} else if (!rue.equals(other.rue))
    			return false;
    		if (ville == null) {
    			if (other.ville != null)
    				return false;
    		} else if (!ville.equals(other.ville))
    			return false;
    		return true;
    	}
     
     
     
    }

    Classe Article
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    public class Article {
     
    	private String nom;
    	private double prixUnitaire ;
    	// j'ai retiré la quantité de l'article car ce n'est pas une caractéristique d'un article, elle diffère selon les factures)
     
     
        //constructeur
        public Article(){
     
        }
     
    	//constructeur	
    	public Article (String nom, double prixUnitaire) {
    	  this.nom   = nom;   
    	  this.prixUnitaire = prixUnitaire;
        }
     
     
    	//tes methodes persos
     
    	//affichage des informations    
         public void afficher() {
    	         System.out.println("nom de l'article        : " + getNom());
    		     System.out.println("Prix unitaire           : " + getPrixUnitaire());
         }
     
     
         // les getters et setters qui vont bien
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public double getPrixUnitaire() {
    		return prixUnitaire;
    	}
     
    	public void setPrixUnitaire(double prixUnitaire) {
    		this.prixUnitaire = prixUnitaire;
    	}
     
     
        //hashCode() et equal() si les noms sont égaux entre 2 article alors ce sont le même article 
     
        @Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((nom == null) ? 0 : nom.hashCode());
    		return result;
    	}
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Article other = (Article) obj;
    		if (nom == null) {
    			if (other.nom != null)
    				return false;
    		} else if (!nom.equals(other.nom))
    			return false;
    		return true;
    	}     
    }
    Classe ArticleFacture
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    //nouvelle classe qui stocke la quantité d'un article sur une facture
    public class ArticleFacture {
     
    	private Article article;
    	private int quantite;
    	private double montantArticle;
     
    	//pas de constructeur vide
     
    	public ArticleFacture(Article article, int quantite) {
    		this.article = article;
    		this.quantite = quantite;
    		this.montantArticle = article.getPrixUnitaire() * quantite; // on calcule le montant pour cette quantité d'articles
    	}
     
    	public Article getArticle() {
    		return article;
    	}
     
    	public void setArticle(Article article) {
    		this.article = article;
    	}
     
    	public int getQuantite() {
    		return quantite;
    	}
     
    	public void setQuantite(int quantite) {
    		this.quantite = quantite;
    	}
     
    	public double getMontantArticle() {
    		return montantArticle;
    	}
     
    	public void setMontantArticle(double montantArticle) {
    		this.montantArticle = montantArticle;
    	}
     
    	// hashCode() et equals() sur l'article et la quantité
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((article == null) ? 0 : article.hashCode());
    		result = prime * result + quantite;
    		return result;
    	}
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		ArticleFacture other = (ArticleFacture) obj;
    		if (article == null) {
    			if (other.article != null)
    				return false;
    		} else if (!article.equals(other.article))
    			return false;
    		if (quantite != other.quantite)
    			return false;
    		return true;
    	}
     
     
    }
    Classe Facture
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    import java.text.DecimalFormat;
    import java.util.Vector;
     
     
     
    public class Facture {
     
    	private double montant = 0; // montant sera toujours initialisé à 0;
    	private Client  client ; // un 't' à client
    	private String naturePayement ; // je ne sais pas si tu t'en sers
    	private Vector<ArticleFacture> articles = new Vector<ArticleFacture>(); 
    	//articles avec un 's' est plus compréhensible et evite les majuscules en début de variable(Art)
    	//je ne stocke plus des Article mais des ArticleFacture pour dissocier la quantité de l'article
     
    	//constructeurs
     
    	public Facture(){
     
    	}
     
    	public Facture(Client client,String naturePayement){ // pas de 's' à facture dans le constructeurs
     
    		this.client = client;
    		this.naturePayement = naturePayement;
    		//this.Art             = Art = new Vector<Article> ();  cà ca pique les yeux... 2 egals à suivre...
    		//et tu as dejà instancier ton vecteur dans la déclaration des variables
    	}
     
    	//tes methodes persos
     
     
    	public void afficher() {
     
    		DecimalFormat monnaie = new DecimalFormat("0.00") ;
     
    		System.out.println("Montant            :" + monnaie.format(montant)); // le "\n" ne sert à rien car tu fais un println (print line) et non print
    		System.out.println("Nature du payement : " + naturePayement);
     
    		client.afficher();
    	}
     
     
    	// méthode pour ajouter des articles à la facture 
    	public void addArticle(Article article, int  quantite){
    		ArticleFacture articleFacture = new ArticleFacture(article, quantite);
    		this.articles.add(articleFacture);
    		this.updateMontant(articleFacture); //mise à jour du montant à l'ajout d'un nouvel article
    	}
     
    	//on met à jour le montant , ajout du montant total de l'article
    	private void updateMontant(ArticleFacture articleFacture){
    		this.montant = this.montant + articleFacture.getMontantArticle();
     
    	}
     
    	// les getters et setters qui vont bien
     
    	public double getMontant() {
    		return montant;
    	}
     
    	public void setMontant(double montant) {
    		this.montant = montant;
    	}
     
    	public Client getClient() {
    		return client;
    	}
     
    	public void setClient(Client client) {
    		this.client = client;
    	}
     
    	public String getNaturePayement() {
    		return naturePayement;
    	}
     
    	public void setNaturePayement(String naturePayement) {
    		this.naturePayement = naturePayement;
    	}
     
    	//hashCode() et equals() si tout les champs sont égaux entre 2 factures alors ce sont la même facture.
     
    	public Vector<ArticleFacture> getArticles() {
    		return articles;
    	}
     
    	public void setArticles(Vector<ArticleFacture> articles) {
    		this.articles = articles;
    	}
     
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result
    				+ ((articles == null) ? 0 : articles.hashCode());
    		result = prime * result + ((client == null) ? 0 : client.hashCode());
    		long temp;
    		temp = Double.doubleToLongBits(montant);
    		result = prime * result + (int) (temp ^ (temp >>> 32));
    		result = prime * result
    				+ ((naturePayement == null) ? 0 : naturePayement.hashCode());
    		return result;
    	}
     
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Facture other = (Facture) obj;
    		if (articles == null) {
    			if (other.articles != null)
    				return false;
    		} else if (!articles.equals(other.articles))
    			return false;
    		if (client == null) {
    			if (other.client != null)
    				return false;
    		} else if (!client.equals(other.client))
    			return false;
    		if (Double.doubleToLongBits(montant) != Double
    				.doubleToLongBits(other.montant))
    			return false;
    		if (naturePayement == null) {
    			if (other.naturePayement != null)
    				return false;
    		} else if (!naturePayement.equals(other.naturePayement))
    			return false;
    		return true;
    	}
     
     
    }

    L'utilisation
    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
     
    Client client = new Client("NOM", "Prénom", "tel", "codeCivic", "rue", "codePostal", "ville", "pays");
     
    Article article_1 = new Article("article_1", 10.5);
    Article article_2 = new Article("article_2", 8.3);
     
    Facture facture = new Facture(client, "naturePayement");
    facture.addArticle(article_1, 10);
    facture.addArticle(article_2, 5);
    facture.addArticle(article_1, 3); // on peut ajouter le même produit avec des quantités différentes car j'ai dissocier les quantité dans ArticleFacture
     
    facture.afficher();
     
     
    //Pour parcourir les articles de la facture (une boucle simple)
     
    Iterator<ArticleFacture> it = facture.getArticles().iterator();
    while(it.hasNext()){
    	ArticleFacture articleFacture = it.next();
     
    	articleFacture.getArticle(); // récupère l'article
    	articleFacture.getQuantite(); // et la quantité
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut reponse thelvin
    Citation Envoyé par thelvin Voir le message
    Malheureusement cela est très discutable.

    En général les getters et setters sont redéfinissables par les sous-classes.
    Or si on redéfinit une méthode appelée par le constructeur d'une classe mère, cela signifie que la méthode de la classe fille s'exécute avant que le constructeur de la classe mère ne soit terminé, et avant même que l'initialisation de la classe fille n'ait commencé. Ce qui est contraire aux règles d'encapsulation, et en général mécompris et source de bugs.

    Il vaut mieux éviter, dans un constructeur, d'appeler des méthodes qui peuvent être redéfinies.
    (Par contre, si les getters/setters sont finaux, là ça se tient.)

    Bonjour,

    Merci pour votre réponse !

    Pour vérifier plus précisément votre réponse, j'ai créé deux classes (Mere et Fille) et j'ai redéfini dans la classe fille les setters et getters de la classe Mere.
    Effectivement, les setter est appelé depuis la classe fille et boucle puisqu'il fait lui-même appel au setter de Mere (obligé puisque la variable est prvate)

    Est-ce cela que vous vouliez mettre en avant dans votre réponse ?

    voici les deux classes que j'ai créées :
    Mere :
    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
    package principal;
     
    public class Mere {
     
    	private String strVar;
     
    	//CONSTRUCTEUR
    	public Mere(String strVar){
    		System.out.println("MERE *** DEBUT CONSTRUCTEUR");
    		setStrVar(strVar);
    		System.out.println("MERE *** FIN CONSTRUCTEUR");
    	}
     
    	public static void main(String[] args) {
     
    		System.out.println("**************DEBUT***************\n\n");
    		Mere mere = new Mere("strVar_mere");
    		System.out.println("\n\n**************FIN*****************");
    		Fille fille = new Fille();
    	}
     
    	//GETTERS ET SETTERS
    	public String getStrVar() {
    		return strVar;
    	}
     
    	public void setStrVar(String strVar) {
    		System.out.println("MERE *** DEBUT setStrVar() avec strVar : " + strVar);
    		this.strVar = strVar;
    		System.out.println("MERE *** FIN setStrVar() avec strVar : " + strVar);
    	}
     
    }
    Fille :
    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
    package principal;
     
    public class Fille extends Mere {
     
     
    	//CONSTRUCTEUR
    	public Fille(){
    		super("strVar_Fille");
    		System.out.println("FILLE *** DEBUT CONSTRUCTEUR");
    		setStrVar("strVar_Fille");
    		System.out.println("FILLE *** FIN CONSTRUCTEUR");
    	}
     
    	//REDEFINITION SETTERS ET GETTERS
    	public void setStrVar(String strVar){
    		System.out.println("FILLE *** DEBUT setStrVar() avec strVar : " + getStrVar());
    		setStrVar(strVar);
    		System.out.println("FILLE *** FIN setStrVar() avec strVar : " + getStrVar());
    	}
     
    	public String getStrVar(){
    		System.out.println("FILLE *** getStrVar()");
    		return getStrVar();
    	}
    }
    Merci,
    OS : LinuxMint 20

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par francky74 Voir le message
    Est-ce cela que vous vouliez mettre en avant dans votre réponse ?
    Euh, non.

    Pour résoudre le problème d'accès aux variables private de la classe mère, il suffit d'appeler super.setStrVar() dans les redéfinitions de la classe fille.

    Le problème dont je parle, c'est qu'au moment où on appelle les méthodes redéfinies par la classe fille, on n'a même pas commencé l'initialisation de la classe fille.
    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
    public class Message {
      private String message;
     
      public Message(String message) {
        setMessage(message);
      }
     
      public void setMessage(String message) {
        this.message = message;
      }
     
      public String getMessage() {
        return message;
      }
    }
    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
    public class MessageSalut extends Message {
     
      private String salutation = "Salut ! ";
     
      MessageSalut(String message) {
        super(message);
      }
     
      public void setMessage(String message) {
        super.setMessage(salutation + message);
      }
     
      public static void main(String[] args) {
        MessageSalut objet = new MessageSalut("Tout le monde va bien.");
        System.out.println(objet.getMessage());
      }
     
    }
    À l'œil, on dirait que ça devrait donner "Salut ! Tout le monde va bien." Qu'est-ce que ça donne en réalité ?

    C'est parce qu'au moment où on appelle setMessage() de la classe MessageSalut, on a pas encore commencé l'initialisation par MessageSalut, et on a pas encore donné de valeur à la variable String salutation, du coup elle est à null.
    Cela arrive parce que cet appel a lieu dans le constructeur de Message, sa classe mère, donc avant de commencer la construction de la classe fille.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour Thelvin,


    Merci pour ces précieuses pécisions !

    Je me suis permis d'ajouter des System.out.println à votre example.

    C'est clair ! On voit bien que le constructeur de Message est appelé avant celui de MessageSalut alors qu'il n'a pas encore été créé.

    Voici mes codes et résultats :

    Message :
    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
     
    public class Message {
      private String message;
     
      public Message(String message) {
    	  System.out.println("Mere - CONSTRUCTEUR");
        setMessage(message);
      }
     
      public void setMessage(String message) {
    	  System.out.println("Mere - SETTER");
        this.message = message;
      }
     
      public String getMessage() {
    	  System.out.println("Mere - GETTER");
        return message;
      }
    }
    MessageSalut :
    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
    public class MessageSalut extends Message {
     
    	private String salutation = "Salut ! ";
     
    	MessageSalut(String message) {
    		super(message);
    		System.out.println("Fille - constructeur");
    	}
     
    	public void setMessage(String message) {
    		System.out.println("Fille - settter");
    		super.setMessage(salutation + message);
    	}
     
    	public static void main(String[] args) {
    		MessageSalut objet = new MessageSalut("Tout le monde va bien.");
    		System.out.println(objet.getMessage());
    	}
     
    }
    Terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Mere - CONSTRUCTEUR
    Fille - settter
    Mere - SETTER
    Fille - constructeur
    Mere - GETTER
    nullTout le monde va bien.
    OS : LinuxMint 20

Discussions similaires

  1. Réponses: 13
    Dernier message: 20/05/2011, 19h11
  2. [PHP 5.3] Problème d'instanciation d'objet
    Par lecra dans le forum Langage
    Réponses: 2
    Dernier message: 08/05/2011, 14h01
  3. [COM] Problème d'instanciation d'objet COM
    Par lpapouk dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/07/2008, 15h14
  4. Réponses: 7
    Dernier message: 18/07/2006, 12h23

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