enrique-j
8/29/2018 - 4:46 PM

Inicializando campos

public class BedAndBreakfast {

// initialize to 10
public static int capacity = 10;

// initialize to false
private boolean full = false;

}

Esto funciona bien cuando el valor de inicialización está disponible y la inicialización se puede poner en una línea. Sin embargo, esta forma de inicialización tiene limitaciones debido a su simplicidad. Si la inicialización requiere algo de lógica (por ejemplo, manejo de errores o un forbucle para llenar una matriz compleja), la asignación simple es inadecuada. Las variables de instancia se pueden inicializar en constructores, donde se puede usar el manejo de errores u otra lógica. Para proporcionar la misma capacidad para las variables de clase, el lenguaje de programación Java incluye bloques de inicialización estáticos .

Bloques de inicialización estática

Un bloque de inicialización estático es un bloque de código normal encerrado entre llaves { }, y precedido por la staticpalabra clave. Aquí hay un ejemplo:

static {

// cualquier código que se necesite para la inicialización va aquí 

}

Su tarea principal es la de inicializar las variables estáticas, por ello son conocidos como inicializadores estáticos, en el ejemplo se inicializa la variable "numero", pero se preguntaran cual sería la diferencia de inicializarla en un metodo estático o directamente cuando se declara,

En comparación con la inicialización dentro de un metódo estático podemos mencionar que el bloque estático solo se ejecuta una sola vez cada que la clase a la que pertenece es cargada por un classloader, y el metódo estatico se puede ejecutar cuantas veces se desee, es decir el número de veces que se invoque:

Por lo tanto el uso de bloques estáticos se adecua más para la inicialización de constantes pues solo se ejecuta una sola ocasión (yo antes lo entendia como una especie de constructor para la parte estática del PermGen, aunque no es lo mismo, ni creo que sea correcto llamarlo así), lo cual no impide que tambien se usen bloques estáticos para dar un valor inicial a una variable que pueda cambiar durante la ejecución del programa.

Usos comunes:

1.-Cargar drivers o elementos a un namespace.

2.-Realizar calculos y/o asignaciones que solo se ejecutaran una sola vez.

3.-Trazado de errores (Logger).

Ventajas:

1.-Puedes ejecutar asignaciones a constantes y variables que requieran la ejecución de algún calculo sin la necesidad de crear una instancia.

2.-Si el código que utilizas para inicializar una constante o variable estática causa excepciones, las puedes manejar en bloques try-catch sin la necesidad de usar metodos estáticos o de instancia.

Limitaciones o desventajas:

1.-El tamaño de los bloques estáticos no debe exceder los 64kb.

2.-No se pueden lanzar excepciones checadas.

3.-No se puede usar la palabra reservada this debido a que no hay una instancia.

4.-No se puede usar la palabra reservada super debido a que no hay una instancia.

5.-No se puede regresar ningun valor o tipo.

6.-Es complicado hacer pruebas a los bloques estáticos.

Inicializando miembros de instancia

Normalmente, pondrías código para inicializar una variable de instancia en un constructor. Hay dos alternativas al uso de un constructor para inicializar variables de instancia: bloques de inicialización y métodos finales.

Los bloques de inicializador para las variables de instancia se parecen a los bloques de inicializador estáticos, pero sin la static palabra clave:

{ // el código que se necesita para la inicialización va aquí }

El compilador 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.

Un método final no puede ser anulado en una subclase. Esto se discute en la lección sobre interfaces y herencia. Aquí hay un ejemplo del uso de un método final para inicializar una variable de instancia:

class Whatever { private varType myVar = initializeInstanceVariable();

protected final varType initializeInstanceVariable() {

    // initialization code goes here
}

}

Insinuación:

Puede usar la assertdeclaración para verificar sus asignaciones. Usted escribe:

assert (expresión booleana para probar); Si la expresión booleana es falsa, recibirá un mensaje de error. Por ejemplo,

afirmar toString (ACE) == "Ace"; debería regresar true, por lo que no aparecerá ningún mensaje de error.

Si usa la assertdeclaración, debe ejecutar su programa con la eabandera:

java -ea YourProgram.class