¿Por qué no se permite una variable final estática calificada en un bloque de inicialización estático?

Caso 1

class Program { static final int var; static { Program.var = 8; // Comstacktion error } public static void main(String[] args) { int i; i = Program.var; System.out.println(Program.var); } } 

Caso 2

 class Program { static final int var; static { var = 8; //OK } public static void main(String[] args) { System.out.println(Program.var); } } 

¿Por qué el Caso 1 causa un error de comstackción?

    El JLS contiene la respuesta (tenga en cuenta la statement en negrita):

    Del mismo modo, cada variable final en blanco se debe asignar como máximo una vez; definitivamente no debe asignarse cuando se realiza una asignación. Tal asignación se define para que ocurra si y solo si el nombre simple de la variable (o, para un campo, su nombre simple calificado por esto) ocurre en el lado izquierdo de un operador de asignación. [ §16 ]

    Esto significa que el ‘nombre simple’ se debe usar cuando se asignan variables finales estáticas, es decir, el nombre var sin ningún calificador.

    Aparentemente este es un truco sintáctico barato para limitar el análisis de (des) asignación definido dentro de la clase misma.

    Si el campo está calificado sintácticamente con un nombre de clase, el código generalmente se encuentra en otra clase, donde el análisis no puede llegar.

    Este truco falla en tu ejemplo. Otros ejemplos de rareza:

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

    Si tuvieran más recursos, probablemente habrían hecho una regla más fina. Pero no podemos cambiar la especificación ahora.