En esta publicación, ilustraré qué son el inicializador de variable de instancia, el inicializador de instancia, el inicializador estático y cómo funciona el inicializador de instancia en Java.
1. Orden de ejecución
Mira la siguiente clase, ¿sabes cuál se ejecuta primero?
public class Foo { //instance variable initializer String s = "abc"; //constructor public Foo() { System.out.println("constructor called"); } //static initializer static { System.out.println("static initializer called"); } //instance initializer { System.out.println("instance initializer called"); } public static void main(String[] args) { new Foo(); new Foo(); } } |
Producción:
static initializer called instance initializer called constructor called instance initializer called constructor called
2. ¿Cómo funciona el inicializador de instancias de Java?
El inicializador de instancia anterior contiene una declaración println. Para entender cómo funciona, podemos tratarlo como una declaración de asignación de variable, por ejemplo, b = 0
. Esto puede hacer que sea más obvio de entender.
En vez de
int b = 0 |
, podemos escribirlo como
int b; b = 0; |
Por lo tanto, los inicializadores de instancia y los inicializadores de variable de instancia son prácticamente lo mismo.
3. ¿Cuándo son útiles los inicializadores de instancia?
El uso de inicializadores de instancia es poco común, pero aún puede ser una alternativa útil a los inicializadores de variables de instancia si:
(1) el código de inicializador debe manejar excepciones
(2) realice cálculos que no se pueden expresar con un inicializador de variable de instancia.
Por supuesto, dicho código podría escribirse en constructores. Pero si una clase tuviera varios constructores, tendría que repetir el código en cada constructor.
Con un inicializador de instancia, puede escribir el código una vez y se ejecutará sin importar qué constructor se use para crear el objeto. (Supongo que esto es solo un concepto y no se usa con frecuencia).
Otro caso en el que los inicializadores de instancia son útiles son las clases internas anónimas, que no pueden declarar ningún constructor en absoluto. (¿Será este un buen lugar para colocar una función de registro?)
Gracias a Heinrich Hartmann por su comentario:
También tenga en cuenta que las clases anónimas que implementan interfaces [1] no tienen constructores. Por lo tanto, los inicializadores de instancia son necesarios para ejecutar cualquier tipo de expresión en el momento de la construcción.
Referencia:
Inicialización de objetos en Java