En otras palabras, ¿por qué necesitaría un inicializador de instancia? ¿Qué diferencia o ventaja tiene al escribir un inicializador de instancia sobre un constructor?
java
instantiation
Ajay
fuente
fuente
Respuestas:
Esto parece explicarlo bien:
Desde: Inicialización del objeto JavaWorld en Java .
fuente
En términos de ciclo de vida de los objetos, no hay diferencia. Ambos se invocan en el momento de la construcción y, lógicamente, el bloque inicializador puede considerarse parte de la construcción.
Semánticamente, un inicializador es una buena herramienta por varias razones:
el inicializador puede mejorar la legibilidad del código manteniendo la lógica de inicialización junto a la variable que se está inicializando:
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 del constructor que se utilice.
Los inicializadores se pueden usar en clases internas anónimas, donde los constructores no pueden.
fuente
theAnswer
. ¿Es eso correcto? o me falta algo.theAnswer
es una variable de instancia declarada. Se inicializa en un bloque inicializador anónimo. Tenga en cuenta el punto y coma después de la declaración de variable.Cuando tiene muchos constructores y desea que se ejecute un código común para cada constructor, puede usar el inicializador de instancia, ya que se llama para todos los constructores.
fuente
Evitaría el idioma del inicializador de instancias en general: la única ventaja real que ofrece sobre los inicializadores de variables es el manejo de excepciones.
Y dado que un método init (invocable desde el constructor) también puede realizar el manejo de excepciones y también centraliza el código de configuración del constructor, pero tiene la ventaja de que puede operar en los valores de los parámetros del constructor, yo diría que el inicializador de la instancia es redundante y, por lo tanto, debe ser evitado.
fuente
La ventaja real de los inicializadores de instancia sobre los constructores se ve cuando usamos 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, por ejemplo, los inicializadores .
fuente
En el momento de la creación del objeto, si queremos realizar la inicialización de las variables de instancia, entonces deberíamos optar por Constructor, además de la actividad de inicialización si queremos realizar alguna actividad en el momento de la creación del objeto, entonces deberíamos ir por el bloque de instancia.
No podemos reemplazar el constructor con el bloque de instancia porque el constructor puede tomar argumentos pero el bloque de instancia no puede tomar argumentos.
No podemos reemplazar el bloque de instancia con el constructor porque una clase puede contener más de un constructor. Si queremos reemplazar el bloque de instancia con el constructor, entonces en cada constructor tenemos que escribir código de bloque de instancia porque en tiempo de ejecución no podemos esperar qué constructor se llamará, esto aumentará innecesariamente el código duplicado.
Ejemplo:
class MyClass{ static int object_count = 0; MyClass(){ object_count++; } MyClass(int i){ object_count++; } void getCount() { System.out.println(object_count); } public static void main(String... args) { MyClass one = new MyClass(); MyClass two = new MyClass(2); two.getCount(); } }
Salida:
2
class MyClass{ static int object_count = 0; { object_count++; } MyClass(){ } MyClass(int i){ } void getCount() { System.out.println(object_count); } public static void main(String... args) { MyClass one = new MyClass(); MyClass two = new MyClass(2); two.getCount(); } }
Salida:
2
fuente
Initializer es una forma de compartir código entre constructores y hace que el código sea más legible si se usa inicializador con declaración de variable.
El compilador de Java copia los bloques inicializadores en cada constructor. Por lo tanto, este enfoque se puede utilizar para compartir un bloque de código entre varios constructores. Documentación de Oracle
fuente