¿Cómo es un inicializador de instancia diferente de un constructor?

En otras palabras, ¿por qué necesitarías un inicializador de instancias? ¿Qué diferencia o ventaja tiene al escribir un inicializador de instancia sobre un constructor?

Esto parece explicarlo bien:

Los inicializadores de instancia son una alternativa útil a los inicializadores variables de instancia siempre que:

  • el código del inicializador debe detectar excepciones, o

  • realizar cálculos sofisticados que no se pueden express con un inicializador de variable de instancia. Podrías, por supuesto, escribir siempre dicho código en constructores.

Pero en una clase que tenía múltiples constructores, tendrías que repetir el código en cada constructor. Con un inicializador de instancia, puede simplemente escribir el código una vez, y se ejecutará sin importar qué constructor se use para crear el objeto. Los inicializadores de instancias también son útiles en clases internas anónimas, que no pueden declarar constructores en absoluto.

De: Inicialización de JavaWorld Object en Java .

En términos de ciclo de vida del objeto, no hay diferencia. Ambos se invocan en el momento de la construcción y, lógicamente, el bloque de inicialización se puede considerar parte de la construcción.

Semánticamente, un inicializador es una buena herramienta para tener por varias razones:

el inicializador puede mejorar la legibilidad del código al mantener la lógica de inicialización al lado de la variable que se inicializa:

public class Universe { public int theAnswer; { int SIX = 6; int NINE = 7; theAnswer = SIX * NINE; } // a bunch of other vars } 

vs

  public class Universe { public int theAnswer; // a bunch of other vars public Universe() { int SIX = 6; int NINE = 7; theAnswer = SIX * NINE; // other constructor logic } } 

Los inicializadores se invocan independientemente de qué constructor se use.

Los inicializadores pueden usarse en clases internas anónimas, donde los constructores no pueden.

Cuando tienes muchos constructores y quieres que se ejecute un código común para cada constructor, puedes usar el inicializador de la instancia. Como se llama para todos los constructores.

Evitaría la expresión idiomática de inicializador de instancias en general: la única ventaja real que otorga a los inicializadores de variables es el manejo de excepciones.

Y dado que un método init (invocable desde el constructor) también puede manejar excepciones y también centraliza el código de configuración del constructor, pero tiene la ventaja de que puede operar en valores de parámetros del constructor. Diría que el inicializador de la instancia es redundante y, por lo tanto, evitado

La ventaja real de los inicializadores de instancias sobre los constructores se ve cuando utilizamos una clase interna anónima.

Las clases internas anónimas no pueden tener un constructor (ya que son anónimas), por lo que son un ajuste bastante natural para los inicializadores de instancia.

El inicializador es una forma de compartir código entre constructores y hace que el código sea más legible si se utiliza el inicializador con statement de variable.

El comstackdor de Java copia bloques de inicializador en cada constructor. Por lo tanto, este enfoque se puede usar para compartir un bloque de código entre múltiples constructores. Documentación de Oracle

    Intereting Posts