java - programacion - ¿Por qué no podemos establecer el valor de la variable final estática en bloque estático a través del nombre de clase
static final java (1)
Una variable final estática debe ser inicializada antes de su uso. Se puede inicializar directamente en el momento de la declaración o en un bloque estático.
Pero cuando usa class.var = x
no se ve como una inicialización sino como una asignación.
Con un JDK 7, el error no puede asignar un valor a la variable final .
Eso explica por qué funciona si eliminas la palabra clave final
class Test {
static final int a = 2; // initialization at declaration time
static final int b;
static final int c;
static {
b = 4; // initialization in static block
Test.c = 6; // error : cannot assign a value to final variable c
}
...
}
EDITAR
En el JLS, la palabra correcta para la inicialización es asignación definida.
Extracto del JLS:
Para cada acceso de una variable local o campo final en blanco x, x debe asignarse definitivamente antes del acceso, o se produce un error en tiempo de compilación.
Del mismo modo, cada variable final en blanco debe asignarse como máximo una vez; debe quedar definitivamente sin asignar cuando se le asigna una asignación.
Dicha asignación se define para ocurrir si y solo si el nombre simple de la variable (o, para un campo, su nombre simple calificado por este) ocurre en el lado izquierdo de un operador de asignación.
Para cada asignación a una variable final en blanco, la variable debe estar definitivamente sin asignar antes de la asignación, o se produce un error en tiempo de compilación.
Enfatiza el mío, pero creo que esta es la verdadera razón del error.
Esta pregunta ya tiene una respuesta aquí:
Por ejemplo, considere el código a continuación:
public static final int a;
public static final int b;
static {
a = 8; // it''s working
Test.b = 10; // compilation error Test.b cannot be assigned.
}
¿Por qué no podemos usar Test.b = 10;
¿Dentro de un bloque estático de la clase Test
? Sin el nombre de la clase está funcionando bien.
¿Hay alguna razón detrás de esto?