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 :

Manipulation d'un attribut private avec un setter dans une autre méthode


Sujet :

Langage Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 69
    Points : 52
    Points
    52
    Par défaut Manipulation d'un attribut private avec un setter dans une autre méthode
    Bonjour;

    Je suis entrain de faire un exercice qui va m'afficher en fin le résultat d'un match de foot entre deux équipes, mais je bloque sur un point , impossible d'afficher le bon résultat, il m'affiche 0 et 0 alors que je doit avoir 4 et 0.
    Je sais que le problème se trouve au niveau de mes 2 méthodes setters. Je n'arrive pas à l’intégrer correctement dans les méthodes qui transmet le résultat à mon instance.

    En fait j'ai 3 classes dans des fichiers séparé, voici le 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
    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
     
     
     
    public class MatchDeLiga {
    	//attributs
    	private Equipe equipe1;
    	private Equipe equipe2;
    	public static int butEquipe1 = 0;
    	public static int butEquipe2 = 0;
     
     
    //Constructeur et initialisation des attributs
    public MatchDeLiga (Equipe equipe1,Equipe equipe2){
     
    this.equipe2= equipe2;
    this.equipe1=equipe1;
    this.butEquipe1 = butEquipe1;
    this.butEquipe2= butEquipe2;
    }
     
    //Getteurs de Equipe2
    public Equipe getEquipe2(){
     
    	return equipe2;
    }
    //Setteur des Equipe2
    public void setEquipe2(){
    	this.equipe2= equipe2;
    }
     
    //Getteurs des equipe1
    public Equipe getEquipe1(){
    	return equipe1;
    }
     
    //Setteur des equipe1
    public void setEquipe1(){
    	this.equipe1 =equipe1;
    }
     
    //Getteurs de but Equipe2
    public static int getButEquipe2(){
     
    	return butEquipe2 = butEquipe2;
    }
    //Setteur de but Equipe2
    public static void setButEquipe2(int butEquipe2){
    	butEquipe2 = butEquipe2;
    }
     
    //Getteurs des buts equipe1
    public static int getButEquipe1(){
    	return butEquipe1;
    }
     
    //Setteur des buts equipe1
    public void setButEquipe1(int butEquipe1){
    	this.butEquipe1 = butEquipe1;
    }
     
    //Mon probleme, je n'arrive pas à implémenter les 2 methodes  setEquipe1 et setEquipe2 
    //pour modifier les valeurs initialement 0 de butEquipe1 et butEquipe2 afin que les methodes  
    //butPourLEquipe1 et butPourLEquipe2 me renvoi le bon resultat. :arf::mur:
     
    //But pour l'equipe1
    public int butPourLEquipe1(int butEquipe1){
    	butEquipe1 = getButEquipe1();
    return butEquipe1;
    }
    //But pour l'equipe2
    public int butPourLEquipe2(int butEquipe2){
     
    	butEquipe2 = getButEquipe2();
    	return butEquipe2;
    }
    }
    /** Deuxième classe**/

    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
     
    public class Equipe {
    //attributs	
    private String nom;
     
     
    //initialisation de l'attribut nom à l'aide du constructeur
    public Equipe(String nom){
    	this.nom = nom;
    }
     
     
    public String getNom(){
     
    	return nom;
    }
     
    public void setNom(String nom){
    	this.nom = nom;
    }
     
    }
    /**La classe principale **/

    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 LeMatch {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		Equipe Real = new Equipe("Real");
    		Equipe Barsa= new Equipe("Barsa");
     
    		MatchDeLiga liga= new MatchDeLiga(Real ,Basa);
    		liga.butPourLEquipe1(4);
    		liga.butPourLEquipe2(0);
     
    //Affiche: Le resultat du match > Real 4 : Barsa 0
    		System.out.println("Résultat du match > "+Real.getNom()+" : " +liga.getButEquipe2()+"  "+Barsa.getNom()+":"+MatchDeLiga.getButEquipe2());
     
    //Il doit m'afficher Real 4: Barsa 0 mais j'obtiens Real 0: Barsa 0
    	}
     
    }
    Merci d'avance, j'espere que les supporteurs de Barsa ne vont pas m'envouloir

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout d'abord, un setter (ou mutateur en français) sert à affecter une valeur à un attribut : il faut donc qu'il y ait obligatoirement un paramètre pour passer cette valeur à affecter.

    On voit donc tout de suite le problème dans setEquipe1() : il manque le paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setEquipe1(){
    	this.equipe1 =equipe1;
    }
    l'a variable this.equipe1 et la variable equipe1 sont exactement la même variable. Tu pourrais supprimer cette ligne puisque elle ne change rien à rien.

    Dans le code suivant, qui est ce que tu aurais dû écrire, la variable this.equipe1 n'est pas la variable equipe1, qui correspond au paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setEquipe1(int equipe1){
    	this.equipe1 =equipe1;
    }
    C'est d'ailleurs ce qui oblige ici à mettre le this., puisque les deux variables ont le même nom. Il ne faut surtout pas écrire ce qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setEquipe1(int equipe1){
    	equipe1 =equipe1;
    }
    Ici, c'est exactement comme ce que tu as écrit : on met la valeur d'une variable dans elle-même et ça ne change rien : on pourrait supprimer la ligne.

    Maintenant, au sujet de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public int butPourLEquipe2(int butEquipe2){
     
    	butEquipe2 = getButEquipe2();
    	return butEquipe2;
    }
    Ça c'est un peu n'importe quoi. C'est une espèce de setter, mais le paramètre passé n'est jamais utilisé (sa valeur est écrasée dès la première ligne), et c'est aussi une sorte de getter qui retourne getButEquipe2(), donc qui ne sert à rien : autant appeler directement getButEquipe2() d'autant plus qu'on est pas obligé de passer un paramètre qui ne sert à rien et dont on aurait même pas de valeur à passer au moment de vouloir récupérer la valeur.

    C'est exactement la même chose que pour setEquipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setButPourLEquipe2(int butEquipe2){
    	this.butEquipe2 = butEquipe2;
    }
    Bien sûr, il faut que le gette correspondant getButEquipe2() existe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int getButEquipe2(){
        return butEquipe2;
    }
    Par ailleurs, il serait mieux que le setter s'appelle setButEquipe2() : c'est une convention, pour que tout le monde s'y retrouve. On ne cherche pas à avoir une phrase qui veut plus ou moins dire quelque chose en français. D'ailleurs setButPourLEquipe n'est pas forcément plus compréhensible que setButEquipe...

    Autre chose : il ne faut surtout pas que butEquipe1 et butEquipe2 soient static. Les buts sont propres à chaque matche, et pas valable pour l'ensemble des matches (une variable static est partagée entre toutes les instances, donc sa valeur est la même pour toutes les instances.
    Elle ne devrait pas être public également : on doit forcer l'usage des setters et getters en la rendant private, pour que la classe ait le contrôle entier de la valeur (par exemple, si dans le setter, tu ajoutes un test pour empêcher de passer -1 comme valeur, qui serait absurde pour un nombre de buts, si le sette permet de faire ça et de soulever une exception par exemple si le nombre de buts est interdit, il est impossible de le faire sur un attribut publique.

    Dernière remarque : on n'est pas obliger d'avoir un setter ou un getter. Certains attributs peuvent être par exemple non modifiables. Par exemple, il n'y a pas de raison que le nom d'une équipe change, surtout pendant un match !

    On pourrait avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Equipe {
     
       private final String nom;
     
       public Equipe(String nom) {
              this.nom=nom;
       }
     
       public String getNom() {
              return nom;
       }
     
    }
    Un getter donc mais pas de setter. En plus, en mettant la variable final, on n'est sûr qu'on ne pourra pas changer le nom.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Merci Joel;

    Pour le code
    Maintenant, au sujet de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public int butPourLEquipe2(int butEquipe2){
     
    	butEquipe2 = getButEquipe2();
    	return butEquipe2;
    }
    Ça c'est un peu n'importe quoi. C'est une espèce de setter, mais le paramètre passé n'est jamais utilisé (sa valeur est écrasée dès la première ligne), et c'est aussi une sorte de getter qui retourne getButEquipe2(), donc qui ne sert à rien : autant appeler directement getButEquipe2() d'autant plus qu'on est pas obligé de passer un paramètre qui ne sert à rien et dont on aurait même pas de valeur à passer au moment de vouloir récupérer la valeur.
    Justement c'est cette partie je n'arrive pas à implémenter correctement car sont deux méthodes dans l’exercice que je ne dois pas modifier les mettre comme de setters. voici comment ils sont implémenté dans la classe principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    		MatchDeLiga liga= new MatchDeLiga(Real ,Basa);
    		liga.butPourLEquipe1(4);
    		liga.butPourLEquipe2(0);
    butPourLEquipe1(4) et butPourLEquipe2(0), sûrement sont deux méthodes mais si je les prends comme des setters, je serais obliger de les modifier alors que c'est pas permis.

    Ma question y a t'il un moyen de les implémenter autrement ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu veux dire qu'on te donne ça comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MatchDeLiga liga= new MatchDeLiga(Real ,Basa);
    liga.butPourLEquipe1(4);
    liga.butPourLEquipe2(0);
    Et que tu ne dois pas le modifier et que tout le reste doit fonctionner avec ?

    Et ben, tu nommes ton setter comme ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void butPourLEquipe1(int buts) {
       butEquipe1=buts;
    }
    Pareil pour butPourLEquipe2.

    Même si c'est une convention qu'un setter soit sous la synxaxe set<xxx> ou <xxx> est le nom de l'attribut, ce n'est pas une obligation.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup Joel pour tes explications qui sont très claires, finalement ça marche.
    L'erreur c'etait au niveau de cette methode.
    Vraiment c'est pas evident la programmation, étant debutant j'ai du mal à comprendre parfois le mécanisme entre les méthodes, les attribut et les instances.

    Une autre question et ce que dans un constructeur on est obligé d'y mettre tout les attributs même ceux qui sont deja initialisé par 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
    18
    19
     
    public class MatchDeLiga {
    	//attributs
    	private Equipe equipe1;
    	private Equipe equipe2;
    	public static int butEquipe1 = 0;
    	public static int butEquipe2 = 0;
     
     
    //Constructeur et initialisation des attributs
    public MatchDeLiga (Equipe equipe1,Equipe equipe2){
     
    this.equipe2= equipe2;
    this.equipe1=equipe1;
     
    //Est-il necessaire de mettre ces 2 attribut suivant malgré qu'ils sont déjà initialisé ?
    this.butEquipe1 = butEquipe1;
    this.butEquipe2= butEquipe2;
    }

  6. #6
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Non, tu ne met dans le constructeur que les attributs qui doivent être initialisé avec des données extérieures. Si le nombre de but est toujours égal à 0 au début, pas la peine de le mettre, puisqu'il est déjà initialisé au dessus.
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Rappel : enlève le static pour butEquipe1 et butEquipe2 !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MatchDeLiga {
    	//attributs
    	private Equipe equipe1;
    	private Equipe equipe2;
    	public static int butEquipe1 = 0;
    	public static int butEquipe2 = 0;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MatchDeLiga {
    	//attributs
    	private Equipe equipe1;
    	private Equipe equipe2;
    	private int butEquipe1 = 0;
    	private int butEquipe2 = 0;
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Merci à vous tous.

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

Discussions similaires

  1. Getter and Setter dans une autre class - SQLite
    Par Rweisha dans le forum Android
    Réponses: 5
    Dernier message: 26/01/2016, 21h07
  2. [XL-2007] DECALER avec référence contenue dans une autre cellule
    Par Kimy_Ire dans le forum Excel
    Réponses: 6
    Dernier message: 19/06/2015, 11h43
  3. Réponses: 3
    Dernier message: 04/10/2012, 17h21
  4. Réponses: 3
    Dernier message: 05/08/2009, 00h34
  5. Probleme avec deux div dans une autre
    Par orphen dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 05/11/2007, 15h10

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