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 :

Principe de POO getter/setter


Sujet :

avec Java

  1. #1
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut Principe de POO getter/setter
    Bonjour,

    Je reviens vers vous car certains concepts de POO ne sont vraiment clairs pour moi, et j'ai besoin de certaines précisions.
    J'ai une classe Person possédant 3 attributs :
    name : type String
    firstName : type String
    birthDate : type LocalDate
    avec les getters/setters associés.
    avec un constructeur possédant en paramètre les attributs name et firstName puisque birthDate doit être intéractif (saisie par l'utilisateur)

    Le setter setBirthDate(LocalDate birthDate) doit posséder le code permettant d'initialiser la date de naissance de façon intéractif puis getBirthDate() de récupérer
    cette dernière une fois l'objet Person instancié.
    Mais j'obtiens null pour birthDate lorsque je fais un toString() sur l'objet Person instancié.

    Code java : 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
     
    public class Person {
        private String name;
        private String firstName;
        private LocalDate birthDate;
     
        public Person(String name, String firstName) {
            this.name = name;
            this.firstName = firstName;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
     
        public String getName() {
            return name;
        }
     
        public String getFirstName() {
            return firstName;
        }
     
        public void setBirthDate(LocalDate birthDate) {
            this.birthDate = birthDate;
        }
     
        public LocalDate getBirthDate() {
            System.out.print("Please enter your birthDate (dd MMMM yyyy) : ");
            String entry = TextIO.getlnString();
            try {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.FRANCE);
                LocalDate birthDate = LocalDate.parse(entry.toLowerCase(), formatter);
                String s = String.format("%1$te %1$tb %1$tY",birthDate);
                //System.out.println("Thanks. Your birthDate format is correct.");
                //System.out.printf("%s%n", s);
                return birthDate;
            } catch (DateTimeParseException exc) {
                System.out.printf("%s is not parsable!%n", entry);
                throw exc;
            }
        }
     
        @Override
        public String toString() {
            return "Person " +
                    "\n name : " + name + "\n firstName : " + firstName + "\n birthDate : " + birthDate;
        }
    }

    Code Java : 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 Main {
        public static void main(String[] args) {
            Person p1 = new Person("SMITH", "John");
            p1.getName();
            p1.getFirstName();
            System.out.print("Please enter your birthDate (dd MMMM yyyy) : ");
            String entry = TextIO.getlnString();
            //p1.setBirthDate();
            p1.getBirthDate();
            //System.out.println(p1.getName());
            //System.out.println(p1.getFirstName());
            System.out.println(p1.toString());
        }
    }

    Merci d'avance.
    Transact.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 458
    Points
    458
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LocalDate birthDate = LocalDate.parse(entry.toLowerCase(), formatter);
    Ici, tu surcharges ton attribut par une variable local a ta methode.
    Donc a chaque fois que tu touches a "birthDate", tu modifies ta variable local et pas ton attribut.
    Lorsque tu surcharge un attribut, pour accéder a l'attribut, tu dois utiliser this.birthDate.

    Mais ta façon de faire ne me semble pas être une bonne pratique puisque tu n'a aucun moyen de récupérer la valeur de ton attribut si a chaque fois que tu appels le getter, tu réaffecte l'attribut avec une nouvelle valeur.

  3. #3
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Les getter/setter sont des méthodes d'accès aux propriétés de ton objet, ça ne doit pas être des méthodes de saisie !

    Ton objet Personne a une responsabilité unique : représenter une personne et ses propriétés.
    Dans la conception que tu donnes, tu n'as pas un getter : tu as une fonction utilitaire qui permet de retourner une date saisie au clavier, mais qui n'a aucun lien avec une instance potentielle de ta classe (vu que tu définis le type de birthDate dans ta méthode : tu "masques" ta propriété de classe qui porte le même nom)

    Ton objet Personne est ce qu'on appelle un conteneur : il définit quelque chose qui a des propriétés. Le but des méthodes set est de mettre à jour ces propriétés. Le but des méthodes get est de récupérer la valeur de ces propriétés


    Si tu veux pouvoir saisir une valeur, il faut que tu utilises une autre classe dans laquelle tu auras le code pour saisir/valider la mise à jour d'une date de naissance (qui sera stockée dans une instance de Personne via la méthode setBirthDate). Donc dans ton main avoir un truc dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            System.out.print("Please enter your birthDate (dd MMMM yyyy) : ");
            LocalDate birthDateSaisie = methodeDeSaisieDeDateAuClavierCeNomEstBeaucoupTropLong();
            p1.setBirthDate(birthDateSaisie );
    Je ne suis pas mort, j'ai du travail !

  4. #4
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Merci encore pour toutes vos précisions.
    En effet, les getters/setters DOIVENT être des méthodes très simples.
    Je vais donc changer ma conception.

Discussions similaires

  1. [VB.NET] Génération automatique Property (getter / setter)
    Par Husqvarna dans le forum Windows Forms
    Réponses: 7
    Dernier message: 23/07/2020, 11h55
  2. [POO] Pourquoi recourir aux Getters/Setters ?
    Par Wormus dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 18/01/2008, 18h38
  3. [NetBeans] generation automatique getters/setters
    Par kenito dans le forum NetBeans
    Réponses: 1
    Dernier message: 12/05/2006, 14h37
  4. [Info]générer automatiquement les getters / setters
    Par lr dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/02/2005, 10h14
  5. configuration getter & setter
    Par otb82 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 15/10/2003, 15h53

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