140 votes

Constructeur par défaut ou initialisation de champ en ligne

Quelle est la différence entre un constructeur par défaut et une simple initialisation directe des champs d'un objet?

Quelles sont les raisons pour préférer l'un des exemples suivants à l'autre?

Exemple 1

 public class Foo
{
    private int x = 5;
    private String[] y = new String[10];
}
 

Exemple 2

 public class Foo
{
    private int x;
    private String[] y;

    public Foo()
    {
        x = 5;
        y = new String[10];
    }
}
 

98voto

davin Points 19682

Initialisers sont exécutées avant de constructeur de corps. (Qui a des implications si vous avez à la fois initialisers et les constructeurs, le constructeur code s'exécute deuxième et remplace une initialisation de la valeur)

Initialisers sont bonnes quand on a toujours besoin de la même valeur initiale (comme dans votre exemple, un tableau de taille donnée, ou un entier de valeur spécifique), mais il peut travailler en votre faveur ou contre vous:

Si vous avez de nombreux constructeurs qui permet d'initialiser les variables différemment (c'est à dire avec des valeurs différentes), puis initialisers sont inutiles parce que les changements seront remplacées, et de gaspillage.

D'autre part, si vous avez de nombreux constructeurs de l'initialiser avec la même valeur, alors vous pouvez enregistrer des lignes de code (et de rendre votre code un peu plus facile à gérer) tout en conservant une initialisation en un seul endroit.

Comme Michael l'a dit, il y a une question de goût, vous aimeriez garder le code en un seul endroit. Bien que si vous avez de nombreux constructeurs de votre code n'est pas dans un seul endroit en tout cas, si je favoriserais initialisers.

26voto

Michael Borgwardt Points 181658

La raison de préférer l’exemple un est que c’est la même fonctionnalité pour moins de code (qui est toujours bon).

En dehors de cela, aucune différence.

Toutefois, si vous n’avez pas de constructeurs explicites, je préfère mettre tout le code d’initialisation dans ceux (et leur chaîne) plutôt que la scission entre les constructeurs et les initialiseurs de champ.

3voto

Bert F Points 27237

Je préfère le champ des initialiseurs, et le recours à un constructeur par défaut lorsqu'il est complexe d'initialisation de la logique à effectuer (par exemple, remplir une carte, un ivar dépend d'un autre à travers une série d'heuristiques étapes à exécuter, etc).

@Michael B a dit:

... Je préfère mettre tout le code d'initialisation dans ceux (et de la chaîne d'eux) plutôt que de le diviser entre les constructeurs et le champ des initialiseurs.

MichaelB (je salue le 71+ K rep) a le sens parfait, mais ma tendance est de garder la simple initialisations dans le en ligne final initialiseurs et faire la partie complexe de l'initialisation dans le constructeur.

2voto

WuHoUnited Points 2601

La seule différence à laquelle je peux penser est que si vous deviez ajouter un autre constructeur

public Foo (int inX) {x = inX; }

puis dans le premier exemple, vous n'auriez plus de constructeur par défaut alors que dans le deuxième exemple, vous auriez toujours le constructeur par défaut (et vous pourrez même l'appeler de l'intérieur de notre nouveau constructeur si nous le voulions)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X