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 :

Attributs, constructeurs et initialisation


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut Attributs, constructeurs et initialisation
    Bonjour,

    ne développant pas en java/objet depuis longtemps j'ai une question existentielle sur la création d'une classe métier, avec ou non l'initialisation de ses attributs.

    Je m'explique : imaginons une class ayant 3 atttributs de type String, un attribut de type List<String>, un d'un type "personnalisé" (d'une autre classe) et un de type int.

    En gros ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class My_New_Class {
        private int id;
        private String myString1;
        private String myString2;
        private String myString3;
        private List<String> myList1;
        private MyObject myObject1;
    }
    Imaginons 2 constructeurs différents :

    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 My_New_Class {
        ...
     
        public My_New_Class(String myString1, String myString2){
            this.myString1 = myString1;
            this.myString2 = myString2; 
        }
     
        public My_New_Class(String myString1, String myString2, String myString3){
            this.myString1 = myString1;
            this.myString2 = myString2; 
            this.myString3 = myString3; 
        }
    }
    Quand faut il initialiser directement les attributs dans leur déclaration ?

    Je pars du principe (enfin ma logique) qu'il faut initialiser les objets "complexes" si il ne le sont pas dans les constructeurs.
    Ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        private List<String> myList1 = null;
        private MyObject myObject1 = null;
    Et j'aurais tendance à initialiser aussi les types "primitifs" qui ne sont pas commun à tous les constructeurs.
    Ici, j'aurais fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        private int id = -1;
        ...
        private String myString3 = null;

    Donc en gros, cela donnerait ceci au final :

    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 My_New_Class {
        private int id = -1;
        private String myString1;
        private String myString2;
        private String myString3 = null;
        private List<String> myList1 = null;
        private MyObject myObject1 = null;
     
        public My_New_Class(String myString1, String myString2){
            this.myString1 = myString1;
            this.myString2 = myString2; 
        }
     
        public My_New_Class(String myString1, String myString2, String myString3){
            this.myString1 = myString1;
            this.myString2 = myString2; 
            this.myString3 = myString3; 
        }
    }
    Selon vous, est ce bon ? ou généralement on évite de le faire dans la déclaration, et on initialise tout dans chaque constructeur ?

    Par avance merci.

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Par défaut, tous les Objets sont initialisés à null, donc il est inutile de faire une telle affectation.
    Quand on fait de l'affectation, c'est souvent pour initialiser une nouvelle liste, par exemple.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut
    donc en gros, je ne devrais laisser que l'initialisation de ID = -1

    Le reste s'initialisant à null quelque soit le type.

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Les types primitifs s'initialisent à 0 pour les numériques.

    Ensuite, savoir s'il vaut mieux initialiser par défaut ou initialiser dans le constructeur, j'ai tendance à trouver que si le constructeur peut changer la valeur (là, le cas de ton id), je préfère le mettre dans le constructeur.

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    pour ma part, je dirais que cela dépend de ton programme et de comment sont utiliser les variables, mais aussi de quel genre d'objet il s'agit.

    prenons l'exemple de la liste que tu as, bien souvent lorsque tu as une liste privée, c'est que tu va l'alimenter avec des objets, pour ensuite la parcourir et / ou utiliser les objets qu'elle contient ou pas.

    dans ce cas je fais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private List<String> myList1 = new MonTypeList<String>();
    La raison est qu'a aucun moment de ton code tu ne te demandera si myList1 est null !

    je ferais une petite remarque sur tes constructeurs, il serais plus logique de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class My_New_Class {
        ...
     
        public My_New_Class(String myString1, String myString2){
            this.myString1 = myString1;
            this.myString2 = myString2; 
        }
     
        public My_New_Class(String myString1, String myString2, String myString3){
            this(myString1, myString2);
            this.myString3 = myString3; 
        }
    }

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut
    je ne connaissais pas ce type d'écriture pour le constructeur appelant un autre..

    Merci

    Pour ce qui est de mes attributs, la plupart sont setter par des valeurs externes. Donc je cherchais l'écriture la plus propre pour bien tout initialiser et ne pas avoir de surprise.

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    n'oublie pas de mettre le sujet en résolu en cliquant sur bouton qui va bien en bas

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/10/2013, 17h09
  2. [Débutant] Problème : definition d'un constructeur d'initialisation
    Par IssamSoft dans le forum C#
    Réponses: 3
    Dernier message: 28/03/2012, 10h02
  3. Constructeur Font initialisation
    Par schneidb dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2007, 16h22
  4. Constructeur avec initialisation
    Par bahaaldine dans le forum C++
    Réponses: 9
    Dernier message: 17/11/2006, 14h01
  5. Constructeur et Initialisation
    Par dazz_x dans le forum Langage
    Réponses: 4
    Dernier message: 16/06/2006, 09h48

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