web-dev-qa-db-fra.com

Java - variables finales

Je sais qu'une fois qu'une dernière variable a une valeur, elle ne peut plus être changée. Cependant, je n'ai que quelques questions à ce sujet:

  • Lorsque j'ai un champ, dites static final JButton button; en dehors d'une classe, puis dans la méthode main, essayez de lui attribuer une valeur, button = new JButton("OK");, une erreur me dit de supprimer le dernier modificateur? Cependant, étant donné que la variable button d'origine ne fait pas encore référence à un objet, j'avais l'impression de pouvoir l'assigner une fois?

  • Deuxièmement, si je supprime complètement la référence à la button et que je ne dispose plus que de static final JButton button; en dehors de la classe, mon IDE déclare: "Le bouton de champ final vide n'a peut-être pas été initialisé." Est-ce que cela signifie que tous les champs finaux doivent doivent être initialisés? Et si oui, doivent-ils être initialisés ici et là car je ne peux pas sembler l'initialiser plus tard.

  • Aussi, question idiote, mais ma supposition initiale que, lorsqu'une variable finale est référencée à une instance ou à un type de données, elle ne peut être affectée à rien d'autre est correcte, non?

Ce code n'est pas complet mais est fourni pour illustrer mon propos: 

public class FinalVarTester {

    static final JButton button;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        button = new JButton("OK");
        container.add(button, BorderLayout.SOUTH);
    }

}
11
Tim

Vous devez initialiser une variable finale statique dans un initialiseur statique ou directement. Donc soit 

static final JButton button = new JButton();

ou 

static final JButton button;

static {
  button = new JButton();
}

La spécification du langage Java contient de la documentation supplémentaire: la section relative aux variables finales spécifie pourquoi vous obtenez l'erreur de compilation:

Il s'agit d'une erreur de compilation si une variable finale est affectée à moins qu'elle ne soit définitivement non affectée (§16) immédiatement avant l'attribution.

et chapitre 16 parle de la mission définitive

18
Robin

Les champs final doivent être initialisés car ce sera leur valeur pour le reste du programme.

Une exception à cela est qu'une variable final peut être initialisée dans le constructeur. Comme les champs statiques n'appartiennent pas à une instance, ils doivent être initialisés (il n'y a pas de constructeur), une initialisation directe ou des blocs d'initialisation statiques sont des options pour le faire.

En ce qui concerne votre dernière question, oui, c’est pourquoi elle s’appelle finale.

3
MByD

Une meilleure manière de codding de Nice: 

public class FinalVarTester 
{    
    static final JButton button; 
    public FinalVarTester()
    {    
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(button, BorderLayout.SOUTH);
        button = new JButton("OK");
    }
    public static void main(String[] args)    
    {
        FinalVarTester vTester = new FinalVarTester();    
    }
}
0
user7718347

Une variable finale ne peut être initialisée qu'une seule fois, via un initialiseur ou une instruction d'affectation. Il n'est pas nécessaire de l'initialiser au moment de la déclaration: il s'agit d'une variable "vierge finale".

Types de variables finales

1) VARIABLE FINALE D'INSTANCE:

Une variable d'instance finale vierge d'une classe doit être définitivement affectée à la fin de chaque constructeur de la classe dans laquelle elle est déclarée; sinon, une erreur de compilation survient

2) VARIABLE FINALE STATIQUE

Une variable statique finale vierge doit être définitivement attribuée à un initialiseur statique de la classe dans laquelle elle est déclarée; sinon, une erreur de compilation survient

Dans les deux cas, l’intention est d’éviter d’utiliser la variable finale avant son initialisation.

Donc, dans votre cas, il doit être initialisé via le bloc initialiseur statique qui s’initialise lorsque la classe est chargée.

Réf: http://fr.wikipedia.org/wiki/Final_(Java)

0
Arun

La bonne réponse est qu'un static final var est toujours initialisé au moment de l'initiation de la classe - soit à la valeur que vous indiquez, soit à la valeur par défaut (null, 0, false).

0
Marko Topolnik

Les variables finales en classe doivent être initialisées dans la déclaration ou dans le constructeur. Vous ne pouvez pas affecter une variable finale dans la fonction principale à moins qu'elle ait été déclarée dans la fonction principale. Tous les champs finaux doivent être initialisés. Toutes les variables doivent être initialisées avant d'être utilisées.

0
Decade Moon

Le problème réside dans l'initialisation de la variable finale dans une méthode de la classe (la méthode principale est aussi la méthode :)). En Java, "final" est comme constant et pourrait être initialisé une seule fois. Faites-le avec la composition au lieu de l'agrégation. 

public class FinalVarTester {

    static final JButton button = new JButton("OK");

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(button, BorderLayout.SOUTH);
    }
}
0
Zhivko Draganov