¿Cuál es la alternativa a un bloque de inicialización no estático?

Mis proyectos tenían algún desarrollador que amaba un bloque de inicialización no estático .

¿Cuál es la alternativa a esto y cuál es el inconveniente de esta alternativa? Supongo: ¿inicializar los valores en el constructor?

¿Por qué deberíamos usar un bloque de no inicialización? Por lo que he entendido, el “bloque de inicialización” se utiliza para establecer valores al crear una instancia de la clase. ¿Entonces un constructor no es suficiente?

public class BlockTest { String test = new String(); //Non-static initialization block { test = "testString"; } } 

Este bloque me confunde y lleva a una legibilidad reducida. ¡Gracias por su respuesta!

En primer lugar, no tiene sentido inicializar la prueba a un nuevo String () allí, ya que el bloque de inicialización lo asigna de inmediato a otra cosa. De todos modos …

Una alternativa es inicializar en la statement:

 public class BlockTest { String test = "testString"; } 

Otro está en el constructor:

 public class BlockTest { String test; public BlockTest () { test = "testString"; } } 

Esas son las dos opciones principales, comunes.

Hay dos usos principales para un bloque de inicialización. El primero es para las clases anónimas que deben realizar alguna lógica durante la inicialización:

 new BaseClass () { List strings = new ArrayList(); { strings.add("first"); strings.add("second"); } } 

El segundo es para la inicialización común que debe ocurrir antes de cada constructor:

 public class MediocreExample { List strings = new ArrayList(); { strings.add("first"); strings.add("second"); } public MediocreExample () { ... } public MediocreExample (int parameter) { ... } } 

Sin embargo, en ambos casos hay alternativas que no usan el bloque de inicialización:

 new BaseClass () { List strings = createInitialList(); private List createInitialList () { List a = new ArrayList(); a.add("first"); a.add("second"); return a; } } 

Y:

 public class MediocreExample { List strings; private void initialize () { strings = new List(); strings.add("first"); strings.add("second"); } public MediocreExample () { initialize(); ... } public MediocreExample (int parameter) { initialize(); ... } } 

Hay muchas maneras de hacer estas cosas, use la forma más apropiada y proporcione el código más claro y fácil de mantener.

El comstackdor inserta un bloque de inicio no estático en cada constructor. El código necesario para inicializar los campos de instancia también se inserta en cada constructor. Esta

 class Test1 { int x = 1; { x = 2; } Test1() { x = 3; } } 

se comstack en el mismo bytecoode como este

 class Test1 { int x; Test1() { x = 1; x = 2; x = 3; } } 

El bloque de iniciación no tiene alternativa, de hecho es una alternativa al constructor.

 public TestClass { TestClass() { } } 

esto es útil en el caso de una clase anónima, porque no puede tener un constructor porque la razón es bastante simple, que no tiene un nombre para la clase, entonces no puede tener un constructor; de lo contrario, ¿cómo la llamará? .

 new MyClass(){ //its an anonymous class, you can't use constructor here { } } 

Sin embargo, puede inicializar la variable en línea con su statement como

 public TestClass { String test = "value"; } 

pero no es una alternativa, porque no puede realizar ninguna operación (por ejemplo, operaciones aritméticas o de cadena) de esta manera, pero puede hacerlo en el bloque de inicialización

 public TestClass { String test = "value"; test = test + " not found"//compiler error { test = test + " not found" // valid } } 
    Intereting Posts