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 :

[debutant] question constructeur


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Par défaut [debutant] question constructeur
    Bonjour,

    Juste une petite question sans doute bête : y a-t-il une différence (performances, mémoire....) entre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public Class Personne {
    String nom="";
    String prenom="";
    Vector numTel=new Vector();
    }
    et

    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 Personne{
    String nom;
    String prenom;
    Vector numTel;
     
    Personne(){
    this.nom="";
    this.prenom="";
    this.numTel=new Vector();
    }
     
    }
    A+ merci

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Je ne sais pas s'il y a une différence de performance mais la première écriture me paraît plus judicieuse. En effet, prenons le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Personne {
        String nom;
        String prenom;
        Vector numTel;
     
        Personne() {
            this.nom="";
            this.prenom="";
            this.numTel=new Vector();
        }
    }
    et maintenant imaginons que l'on etende la classe Personne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Enfant extends Personne {
        String jouetPrefere;
     
        Enfant() {
            jouetPrefere = "";
        }
    }
    Dans ce cas on vois bien que les attributs nom, prenom et numTel ne sont pas initialisés.
    L'initialisation à la déclaration me paraît beaucoup plus sûre.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    On m'a toujours appris (peut-être que c'est faux), et j'ai pris ca comme une convention, à ne jamais initialiser les variables de classe lors de leur déclaration mais à toujours les initialiser dans els constructeurs.

    le y@m's>
    Prenons un exemple concret :
    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
     
    import javax.swing.*;
     
    public class MaFrame extends JFrame
    {
    	MaFrame()
    	{
    	}
     
    	public static void main(String[] args)
    	{
    		MaFrame m=new MaFrame();
    		m.setVisible(true);
    	}
    }
    Aucun appel a super(), et pourtant ma frame est bien crée. L'appel à super() est implicite il me semble...
    Mieux vaut faire la deuxième solution, pour moi c'est la plus propre/claire.

    Fred

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    effectivement, j'avais oublié l'appel implicite à super()
    mea culpa
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par le y@m's
    Dans ce cas on vois bien que les attributs nom, prenom et numTel ne sont pas initialisés.
    Pourtant ils sont bien initialisé : lorsqu'on hérite le constructeur effectue un appel implicite au constructeur de la classe parente.

    Et je rappelle que si vous ne déclarer aucun constructeur dans une classe, elle en aura automatiquement un sans paramètre.


    Sinon la principale différence pour moi c'est l'ordre d'initialisation : les initialisation à la déclaration seront effectué avant l'appel du constructeur (mais après l'initialisation de la classe parent). Le code suivant le montre bien (la méthode value() sert uniquement à flagger l'initialisation) :
    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
    class A {
        String a = Main.value("A.a");
        String b;
        A() {
            this.b = Main.value("A.b");
        }
    }
     
    class B extends A {
     
        String c = Main.value("B.c");
        String d;
        B() {
            this.b = Main.value("B.d");
        }
    }
     
     
    public final class Main {
     
        public static String value(String s) {
            System.out.println(s);
            return s;
        }
     
     
        public static void main(String[] args) {
            new B();
        }
    }
    Ce qui donne : Perso j'utilise l'initialisation en ligne pour des valeurs qui ne sont pas modifiés par le constructeur, et des initialisations dans le constructeur pour les autres (afin d'éviter de créer des objets temporaires inutiles), 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
    public class Personne {
        String nom;
        String prenom;
        // on crée toujours le vecteur :
        Vector numTel = new Vector();
     
        Personne(){
            this("","");
        }
     
        Personne(String nom, String prenom) {
            this.nom = nom;
            this.prenom = prenom;
        }
    }
    Mais l'initialisation en ligne peut également être utilisé pour des valeurs par défaut...

    a++

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Par défaut
    une fois de plus , merci pour ces indications :-)
    a+

    (je mets Resolu)

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

Discussions similaires

  1. [debutant]Question technique
    Par toto4650 dans le forum Débuter
    Réponses: 23
    Dernier message: 13/07/2005, 02h06
  2. Réponses: 48
    Dernier message: 06/01/2005, 18h02
  3. [debutant]Question toute bete sur le messages
    Par flogreg dans le forum Servlets/JSP
    Réponses: 18
    Dernier message: 09/09/2004, 09h07
  4. [debutant] Questions a propos du XML
    Par brune dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/06/2004, 09h39
  5. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49

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