variable referencias metodo inicializadores ejemplos clase java

referencias - packages en java



¿Por qué inicializadores de instancia Java? (4)

Dado que todos los ejemplos de código aquí usan clases anónimas, junté esta clase (un poco horrorosa) que demuestra el uso de inicializadores de instancia en una clase "adecuada". Puede usarlos para realizar procesos complejos o manejar excepciones en el momento de la inicialización. Observe que estos bloques se ejecutan antes de que se ejecute el constructor, pero el constructor se ejecuta antes de que se ejecuten los inicializadores en una clase secundaria:

import java.util.Scanner; public class InstanceInitializer { int x; { try { System.out.print("Enter a number: "); x = Integer.parseInt(new Scanner(System.in).nextLine()); } catch (NumberFormatException e) { x = 0; } } String y; { System.out.print("Enter a string: "); y = new Scanner(System.in).nextLine(); for(int i = 0; i < 3; i++) y += y; } public InstanceInitializer() { System.out.println("The value of x is "+x); System.out.println("The value of y is "+y); } public static class ChildInstanceInitializer extends InstanceInitializer { { y = "a new value set by the child AFTER construction"; } } public static void main(String[] args){ new InstanceInitializer(); new InstanceInitializer(); System.out.println(); System.out.println(new ChildInstanceInitializer().y); // This is essentially the same as: System.out.println(new InstanceInitializer(){ {y = "a new value set by the child AFTER construction";} }.y); } }

Esto produce (algo como):

Enter a number: 1 Enter a string: a The value of x is 1 The value of y is aaaaaaaa Enter a number: q Enter a string: r The value of x is 0 The value of y is rrrrrrrr Enter a number: 3 Enter a string: b The value of x is 3 The value of y is bbbbbbbb a new value set by the child AFTER construction Enter a number: s Enter a string: Hello The value of x is 0 The value of y is HelloHelloHelloHelloHelloHelloHelloHello a new value set by the child AFTER construction

Observe que la cadena de "nuevo valor" no se establece hasta después de que el constructor de la clase principal ya haya sido llamado.

Esta pregunta ya tiene una respuesta aquí:

¿Cuál es el sentido de "inicializadores de instancia" en Java?
¿No podemos simplemente poner ese bloque de código al principio del constructor?


De hecho, podrías poner el código al comienzo de cada constructor. Sin embargo, ese es precisamente el punto de un inicializador de instancia: su código se aplica a todos los constructores, lo que puede ser útil si tiene muchos constructores y un poco de código que es común a todos ellos.

(Si recién está comenzando con la programación, es posible que no sepa que es posible crear muchos constructores para la misma clase (siempre que tomen parámetros diferentes); esto se conoce como sobrecarga de constructores . Si solo tiene uno constructor, entonces un inicializador de instancia no es muy útil (Edición: a menos que abuses de él de manera creativa, como se ilustra en las otras respuestas).


Los uso muy a menudo, normalmente para crear y poblar mapas en una declaración (en lugar de usar un bloque estático feo):

private static final Map<String, String> CODES = new HashMap<String, String>() { { put("A", "Alpha"); put("B", "Bravo"); } };

Un adorno interesante y útil para esto es crear un mapa no modificable en una declaración:

private static final Map<String, String> CODES = Collections.unmodifiableMap(new HashMap<String, String>() { { put("A", "Alpha"); put("B", "Bravo"); } });

Manera más ordenada que usar bloques estáticos y tratar con asignaciones singulares al final, etc.

Y otro consejo: no tenga miedo de crear métodos que simplifiquen su bloque de instancia:

private static final Map<String, String> CODES = new HashMap<String, String>() { { put("Alpha"); put("Bravo"); } void put(String code) { put(code.substring(0, 1), code); } };


Puede usar el inicializador de instancia al declarar una clase anónima, por ejemplo, al realizar el lenguaje de inicialización de doble refuerzo .

List<String> mylist = new ArrayList<String>(){{add("a"); add("b"); add("c");}};

Aquí puede inicializar el objeto aunque no puede agregar nada al constructor (porque la clase es anónima).