una puede poo modificador metodos metodo instanciar finales clases clase java static final static-initialization qualified-name

java - poo - se puede instanciar una clase final



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

Caso 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); } }

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 compilación?


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(A.a); // 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.


El JLS contiene la respuesta (tenga en cuenta la declaración 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.