toreo studio que programacion móviles desarrollo curso confirmacion aplicaciones alternativa java constructor initialization block non-static

java - studio - programacion android pdf 2018



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

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

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

¿Por qué deberíamos usar un bloque que no sea de inicialización? Por lo que entiendo, el "bloque de inicialización" se usa para establecer valores al crear una instancia de la clase. ¿Un constructor no es suficiente?

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

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


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 se puede tener un constructor, la razón es bastante directa, que no tiene nombre para la clase, entonces no se puede tener constructor, de lo contrario, ¿cómo se lo nombrará? .

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

Sin embargo, puede inicializar la variable en línea con su declaración como

public TestClass { String test = "value"; }

pero no es una alternativa, porque no puede realizar ninguna operación (digamos operaciones aritméticas o de cuerda) 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 } }


El compilador 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; } }

compila en el mismo bytecoode que este

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


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

Una alternativa es inicializar en la declaración:

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 y comunes.

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

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

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

public class MediocreExample { List<String> strings = new ArrayList<String>(); { 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<String> strings = createInitialList(); private List<String> createInitialList () { List<String> a = new ArrayList<String>(); a.add("first"); a.add("second"); return a; } }

Y:

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

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