89 votes

Initialiser un champ final statique dans le constructeur

public class A 
{    
    private static final int x;

    public A() 
    {
        x = 5;
    }
}
  • final signifie que la variable ne peut être assignée qu'une seule fois (dans le constructeur).
  • static signifie qu'il s'agit d'une instance de classe.

Je ne vois pas pourquoi c'est interdit. Où ces mots clés interfèrent-ils les uns avec les autres ?

196voto

adarshr Points 25912

Un constructeur sera appelé à chaque fois qu'une instance de la classe est créée. Ainsi, le code ci-dessus signifie que la valeur de x sera réinitialisée à chaque création d'une instance. Mais parce que la variable est déclarée finale (et statique), vous ne pouvez le faire que

class A {    
    private static final int x;

    static {
        x = 5;
    }
}

Mais, si vous supprimez statique, vous êtes autorisé à le faire :

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

OU ceci :

class A {    
    private final int x;

    {
        x = 5;
    }
}

19voto

Sean Patrick Floyd Points 109428

les variables finales statiques sont initialisées lorsque la classe est chargée. Le constructeur peut être appelé beaucoup plus tard, ou pas du tout. De plus, le constructeur sera appelé plusieurs fois (avec chaque nouvel objet ), de sorte que le champ ne pourrait plus être définitif.

Si vous avez besoin d'une logique personnalisée pour initialiser votre champ final statique, mettez-la dans un bloc statique

6voto

rfeak Points 5488

Pensez à ce qui se passe la deuxième fois que vous instanciez un objet. Il essaie de le REMETTRE en place, ce qui est expressément interdit par le fait d'être une finale statique. Il ne peut être défini qu'une seule fois pour la classe entière, pas l'instance.

Vous devez définir la valeur lorsque vous la déclarez

private static final x=5;

Si vous avez besoin d'une logique supplémentaire ou d'une instanciation plus complexe, cela peut être fait dans un bloc d'initialisation statique.

5voto

ap2cu Points 19

static signifie que la variable est unique sur l'application. final signifie qu'elle ne doit être définie qu'une seule fois.

Si vous le définissez dans votre constructeur, vous autorisez à définir la variable plus d'une fois.

Par conséquent, vous devez l'initialiser directement ou proposer une méthode statique pour l'initialiser.

3voto

Lukas Eder Points 48046

Pensez-y. Vous pouvez le faire avec votre code :

A a = new A();
A b = new A(); // Wrong... x is already initialised

Les bonnes façons d'initialiser x sont :

public class A 
{    
    private static final int x = 5;
}

ou

public class A 
{    
    private static final int x;

    static
    {
        x = 5;
    }
}

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