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(Ssortingng[] 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(Ssortingng[] args) { System.out.println(Program.var); } } 

Pourquoi Case 1 provoque-t-il une erreur de compilation?

Le JLS détient la réponse (notez la déclaration en gras):

De même, chaque variable finale vierge doit être atsortingbuée au plus une fois; il doit être définitivement non affecté lorsqu’une affectation se produit. Une telle assignation est définie pour se produire si et seulement si le nom simple de la variable (ou, pour un champ, son nom simple qualifié par cela) se produit sur le côté gauche d’un opérateur d’affectation. [ §16 ]

Cela signifie que le “nom simple” doit être utilisé lors de l’atsortingbution de variables finales statiques – c’est-à-dire le nom de la variable sans qualificatifs.

Apparemment, il s’agit là d’une astuce syntaxique peu coûteuse pour limiter l’parsing de (dé) affectation définie au sein même de la classe.

Si le champ est qualifié de manière syntaxique avec un nom de classe, le code est généralement dans une autre classe, où l’parsing ne peut pas atteindre.

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

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

S’ils avaient plus de ressources, ils auraient probablement fait une règle plus fine. Mais nous ne pouvons pas changer les spécifications maintenant.