Estaba leyendo sobre la palabra clave final en Java en Wikipedia aquí (https: //en.wikipedia.org/wiki/Final_(Java)#Final_variables) y estaba un poco confundido por la primera oración. Dice:

Una variable final solo se puede inicializar una vez, ya sea a través de un inicializador o una declaración de asignación.

¿Qué es un "inicializador" en este contexto? Busqué en Google y aprendí acerca de un "bloque inicializador" que se ejecuta antes que los constructores, pero no creo que a eso se refiera esto, ya que un bloque inicializador aún lograría la asignación con declaraciones de asignación. Entonces, ¿qué es un "inicializador" que puede hacer el mismo trabajo que una declaración de asignación?

1
Stephen 7 mar. 2018 a las 04:49

3 respuestas

La mejor respuesta

Ese párrafo de Wikipedia está increíblemente mal redactado. Puedes inicializar tu variable final

  • cuando lo declaras,
  • en un bloque de inicializador después de declararlo, fuera de cualquier método o constructor, o
  • en un constructor

Debe elegir solo uno de estos lugares. No puede inicializar una variable final dos veces.

4
Dawood ibn Kareem 7 mar. 2018 a las 02:10

La palabra clave es una vez . Tu puedes hacer

final int i = 1;

o

final int i;
{
    i = 1;
}

Que es un bloque de inicialización; y sí, se copiará (tal como lo hace el primer ejemplo) en cada constructor (incluido el predeterminado si no se proporciona ninguno explícitamente).

3
Elliott Frisch 7 mar. 2018 a las 01:53

Ese inicializador no se refiere a un bloque de inicializador . Se refiere a una declaración de campo que se acompaña con una expresión de inicialización, como se define en JLS aquí. Por ejemplo,

class Example {
    final Foo theField = new Foo();
}

theField sería un campo que tiene un inicializador en lugar de

class Example {
    final Foo theField;
    public Example(Foo foo) {
        this.theField = foo; // a normal assignment
    }
}

La presencia de un inicializador influye en si un campo puede considerarse un variable constante, un tipo de expresión constante.

-1
Sotirios Delimanolis 18 abr. 2019 a las 05:06