52 votes

Pourquoi une variable finale statique qualifiée n'est-elle pas autorisée dans un bloc d'initialisation statique?

Cas 1

 class Program {
    static final int var;

    static {
        Program.var = 8;  // Compilation error
    }

    public static void main(String[] args) {
        int i;
        i = Program.var;
        System.out.println(Program.var);
    }
}
 

Cas 2

 class Program {
    static final int var;

    static {
        var = 8;  //OK
    }

    public static void main(String[] args) {
        System.out.println(Program.var);
    }
}
 

Pourquoi le cas 1 provoque-t-il une erreur de compilation?

43voto

arshajii Points 65653

Le JLS détient la réponse. (note de l'instruction en gras):

De même, tous les espaces dernière variable doit être attribuée qu'une fois au plus; il doit être certainement non attribuées lors d'une cession à il se produit. Une telle cession est définie de se produire si et seulement si le simple nom de la variable (ou, pour un champ, son simple nom qualifié par le présent) se produit sur le côté gauche d'un opérateur d'affectation. [§16]

Cela signifie que le simple nom doit être utilisé lors de l'affectation statique de la finale de variables - à-dire le var nom sans aucune qualification.

7voto

irreputable Points 25577

Apparemment, il s’agit d’une astuce syntaxique peu coûteuse pour limiter l’analyse des (dés) assignations définies dans la classe elle-même.

Si le champ est qualifié syntaxiquement avec un nom de classe, le code est généralement dans une autre classe, où l'analyse ne peut pas aboutir.

Cette astuce échoue dans votre exemple. Autres exemples de curiosité:

 static class A
{
    static final int a;
    static
    {
        // System.out.println(a); // illegal
        System.out.println(A.a);  // compiles!
        a = 1;
    }
}
 

S'ils avaient plus de ressources, ils auraient probablement créé une règle plus précise. Mais nous ne pouvons pas changer les spécifications maintenant.

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