2009-07-30 7 views
2

Possible en double:
Best Practice: Initialize class fields in constructor or at declaration?Meilleure pratique pour initialiser les variables membres?

Je travaille avec C#, mais cela s'applique probablement à Java (ou toute autre langue qui permet ce comportement aussi bien) ...

Quel chemin est préférable/meilleure pratique? Je suppose toujours besoin _memberVar

1.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = new Dictionary<int, string>(); 

    public MyClass() {} 
} 

- OU -

2.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = null 

    public MyClass() 
    { 
     _memberVar = new Dictionary<int, string>(); 
    } 
} 

Maintenant nous allons dire que MyClass a plus de 10 constructeurs ... Donc, je ne veux pas avoir _memberVar = new Dictionary<int, string>(); dans tous ces constructeurs lol. Y at-il quelque chose de mal avec la 1ère voie? Merci

Edit: Je me rends compte que je peux enchaîner les constructeurs, mais cela est une classe assez complexe ... certains constructeurs appellent la base, certains appels d'autres constructeurs déjà etc etc

+0

dupliquer de http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration – M4N

+0

et désolé de la dupe ... – Polaris878

Répondre

2

Vous n'avez pas besoin d'initialiser les variables membres, mais cela ne fait pas de mal si vous le faites. Les variables membres acquièrent automatiquement leurs valeurs par défaut, généralement null pour les objets et la valeur par défaut pour les types primitifs (par exemple 0 pour int). Comme pour avoir différents constructeurs, vous n'avez pas besoin de répéter l'initialisation des membres dans chaque version car vous pouvez appeler un constructeur surchargé de n'importe quel autre comme vous le feriez avec une méthode surchargée.

En ce qui concerne les meilleures pratiques, personnellement J'initialise les variables membres dans le constructeur car c'est là que je veux "construire" mon objet dans un état stable. En d'autres termes, même si j'aurais initialisé les variables membres où je les déclare, quand le constructeur est appelé, ce serait comme si je nettoyais l'ardoise.

0

Idéalement, vous devriez utiliser l'injection de dépendance pour cela. Cela signifie que vous laissez l'instantiateur de votre classe créer de nouvelles instances de dépendances et les injecter dans une nouvelle instance de la classe plutôt que de laisser la classe créer elle-même les dépendances.

+0

Ce code est en le fournisseur ... soooo yeah haha ​​ – Polaris878

+0

Je prendrais ce conseil avec un grain de sel. De nos jours, les gens lancent une «injection de dépendance» à chaque problème, mais finalement, un objet est responsable de l'instanciation d'autres objets. Dans votre exemple, la variable membre est un 'Dictionary', donc je suppose qu'il s'agit d'un objet feuille juste à la fin du graphe d'objet, auquel cas l'objet courant serait responsable de sa création. –

0

La première méthode est la façon dont je le fais généralement, et est complètement acceptable si tous vos constructeurs l'initialisent à la même valeur. Je le préfère nettement pour les variables statiques afin d'éviter la déclaration explicite d'un constructeur statique.

1

En ce qui concerne _memberVar initialisé dans 10 constructeurs: Je pense que vous devez repenser votre classe. Cela semble excessif. Si vous faites le même travail dans chaque constructeur, alors vous violez DRY. Au lieu de cela, essayer d'adopter cette structure:

public class MyClass { 
    Foo _foo; 
    Bar _bar; 
    Baz _baz; 

    public MyClass(Foo foo, Bar bar, Baz baz) { 
     _foo = foo; _bar = bar; _baz = baz; 
    } 

    public MyClass(Foo foo, Bar bar) : this(foo, bar, new Baz()) { } 

    public MyClass(Foo foo) : this(foo, new Bar()) { } 

    public MyClass() : this(new Foo()) { } 
} 

Notez que je intentionnellement fait pas appel dans le plus large constructeur dans chacun des autres, mais CASCADE à la place afin d'hériter le comportement en cas le sens des valeurs par défaut changé pour chaque. En ce qui concerne l'initialisation de membre à la déclaration, si le membre n'est pas construit en utilisant l'un des arguments d'un constructeur, je préfère l'initialiser à la déclaration.

Questions connexes