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 :

Declaration et initialisation d'objet, bonne méthode?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 176
    Par défaut Declaration et initialisation d'objet, bonne méthode?
    Bonjour à tous j'aurai besoin de votre avis sur une "bonne pratique" à avoir,
    il est mieux de faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Utilisateur utilisateur;
            .
            .
            .
            utilisateur = new Utilisateur();

    ou, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Utilisateur utilisateur = new Utilisateur();

    ou autre???

  2. #2
    Membre confirmé
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Par défaut
    Bonsoir abysr,

    étant "débutant" en Java ma réponse pourrait te paraitre bizarre, mais c'est juste une question de manière de coder, et je ne pense pas que ça puisse affecter la mémoire, mais j'ai remarqué que parfois en utilisant Netbeans, il me demande de déclarer, avant d'instancier. comme le 1er exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Utilisateur utilisateur;   // déclaration.
     
     utilisateur = new Utilisateur();  // instanciation.
    -Pour ma part le 1er c'est mieux et me parait plus clean !

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    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 : 764
    Par défaut
    Bonjour,

    cela dépend de ton besoin :
    si tu déclare ton instance à l'intérieur d'une méthode, elle ne vivra que dans cette méthode et te rendra null si tu l'appelle en dehors.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void maMéthode() {
    	MaClasse maclasse = new Maclasse();
    }

    Si tu déclare ton instance en dehors d'une méthode, et que tu l'instancie dans le constructeur, cette instance sera valable pour ton la durée de vie de l'instance construite ....

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MaClasse() {
    	MaClasse maclasse;
    	public MaClasse() {
    		maclasse = new Maclasse();
    	}
    }
    et cela vaut aussi pour les try catch !!

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void maMethode{
    		try {
    			MaClasse maclasse = new MaClasse();
    		} catch (ArrayIndexOutOfBoundsException e) {
    			e.printStackTrace();
    		}
     
    		System.out.println(maclasse); //ici maclasse vaut null car en dehors du try / catch
    }
    Pour pouvoir utiliser l'instance en dehors du try / catch, il faut plutôt faire cela (si tu en as besoin en dehors du try / catch) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void maMethode{
    		MaClasse maclasse;
                    try {
    			maclasse = new MaClasse();
    		} catch (ArrayIndexOutOfBoundsException e) {
    			e.printStackTrace();
    		}
     
    		System.out.println(maclasse.toString); //ici maclasse ne vaut plus null
    }
    Voilà, j'espère ne pas raconter de bêtises et j'espère que l'ont me corrigera si je dit faux !

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mouais, pas très convaincant tout ça -_-°.

    En termes d’exécution du programme, bien sûr, ça ne change rien : les deux donnent la même chose après compilation.

    En termes de propreté, par contre, il vaut mieux viser le deuxième. Ce n'est pas toujours possible, parfois on ne peut pas, mais il vaut mieux viser le deuxième et se rabattre sur le premier quand le deuxième ne convient pas.
    En fait, le premier, avec ses ". . ." semble indiquer qu'il y a beaucoup de lignes entre la déclaration et l'initialisation, et ça... Ce n'est jamais intéressant. Même si on fait des lignes séparées, elles doivent être groupées ensemble.

    La raison de viser le deuxième, c'est que, de manière générale, il vaut mieux commencer à créer des variables, au plus proche de l'endroit où elles vont servir. Donc dans le même genre, si une variable ne sert que dans une boucle, il vaut mieux la déclarer dans cette boucle qu'en dehors.
    Pourquoi, eh bien tout simplement parce qu'en déclarant les variables ailleurs que là où elles vont servir, on se rend capable de s'en servir ailleurs. C'est à dire à d'autres endroits que le bon endroit. C'est à dire au mauvais endroit. Et ainsi naissent les bugs, plus difficiles à retrouver parce qu'on a pas remarqué que cette variable était déclarée et utilisée ailleurs que là où elle le devait.
    C'est pas plus compliqué que ça.

    C'est le principe même des langages à typage statique : s'arranger pour ne pas pouvoir faire ce qu'il ne faut pas faire, histoire de gagner du temps en évitant certaines erreurs.

    Citation Envoyé par francky74 Voir le message
    Pour pouvoir utiliser l'instance en dehors du try / catch, il faut plutôt faire cela (si tu en as besoin en dehors du try / catch) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void maMethode{
    		MaClasse maclasse;
                    try {
    			maclasse = new MaClasse();
    		} catch (ArrayIndexOutOfBoundsException e) {
    			e.printStackTrace();
    		}
     
    		System.out.println(maclasse.toString); //ici maclasse ne vaut plus null
    }
    Voilà, j'espère ne pas raconter de bêtises et j'espère que l'ont me corrigera si je dit faux !
    Ben, en fait, cela ne marche pas du tout -_-°. La variable ne vaut pas null, elle n'a jamais valu null.
    Mais en dehors du try/catch elle n'est pas garantie d'avoir été initialisée (la ligne maclasse = new MaClasse(); peut échouer à cause d'une Exception.) Si elle n'est pas garantie d'être initialisée, elle ne peut pas être lue, et donc ce code ne compile pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par francky74 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void maMethode{
    		try {
    			MaClasse maclasse = new MaClasse();
    		} catch (ArrayIndexOutOfBoundsException e) {
    			e.printStackTrace();
    		}
     
    		System.out.println(maclasse); //ici maclasse vaut null car en dehors du try / catch
    }
    On peut même ajouter que le code ci-dessus ne compile pas non plus : la variable maclasse existe dans le bloc du try et pas en dehors. Il ne vaut pas null en dehors, ni autre chose, elle n'existe simplement pas en dehors du bloc, donc valloir quelque chose n'a aucun sens (à moins qu'il ne s'agisse d'une variable de la classe où se trouve la méthode maMethode(), auquel cas, ce ne sont pas les mêmes variables (elles n'ont en commun que leur nom, et c'est une pratique à éviter pour éviter toutes difficultés, à déboguer le code, liées à la confusion évidente entre les deux).
    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.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Allez, je démonte les troisième bout de code.

    Citation Envoyé par francky74 Voir le message
    cette instance sera valable pour ton la durée de vie de l'instance construite ....

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MaClasse() {
    	MaClasse maclasse;
    	public MaClasse() {
    		maclasse = new Maclasse();
    	}
    }
    En admettant que ça compile (c'est à dire en corrigeant le problème du C majuscule dans Maclasse), ce code va juste partir en StackOverflowError. On ne s'instancie pas soi même dans son constructeur!

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Par défaut
    Citation Envoyé par francky74 Voir le message
    Bonjour,

    cela dépend de ton besoin :
    si tu déclare ton instance à l'intérieur d'une méthode, elle ne vivra que dans cette méthode et te rendra null si tu l'appelle en dehors.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void maMéthode() {
    	MaClasse maclasse = new Maclasse();
    }

    Et l'accent dans le nom de la méthode on en parle? (Oui Java l'autorise, mais bon, tant qu'on est dans les bonnes pratiques...)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/11/2011, 07h41
  2. Réponses: 4
    Dernier message: 01/05/2011, 23h50
  3. [debutant] declaration et initialisation de tableaux
    Par harsh dans le forum Débuter
    Réponses: 12
    Dernier message: 18/03/2005, 23h39
  4. [EJB2.1 Entity] [CMP] Est-ce la bonne méthode ?
    Par stailer dans le forum Java EE
    Réponses: 8
    Dernier message: 20/06/2004, 19h42
  5. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12

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