Iniciadores estaticos

fitog
08 de Mayo del 2006
Hola a todos:

Soy nuevo por aqui, y estoy empezando con Java. Para aprender estoy siguiendo el libro de Bruce Eckel "Piensa en Java". Esta muy bien, pero hay temas que se me escapan un poco.

Uno de ellos es el de los iniciadores estaticos.

No me queda bien claro la diferencia que hay entre:

static Taza c1;
static Taza c2;
static
{
c1 = new Taza c1;
c2 = new Taza c2;
}

y

static Taza c1=new Taza c1;
static Taza c2=new Taza c2;

Espero me lo podais aclarar.

Gracias

Diego
08 de Mayo del 2006
Que yo sepa no hay ninguna diferencia en ese caso, es más bien cuestión de gustos; el bloque de iniciación estático es útil cuando quieres ejecutar instrucciones, por ejemplo, imagina que tienes un array de boolean y quieres que inicialmente todos los valores estén a true:
private static boolean [] matriz;

static{
matriz=new boolean[10];
java.util.Arrays.fill(matriz,true);
}
Espero haberte aclarado la utilidad del bloque de inicialización estática.

chuidiang
08 de Mayo del 2006
Hola:
En realidad sí hay diferencia, pero no creo que afecten al 99.9% de las aplicaciones. La diferencia es el momento en que se ejecuta la inicializacion.

Si haces por ejemplo

static Taza c1 = new Taza();

se que esta inicializacion se ejecuta en el momento que accedes por primera vez al atributo "c1". Esto es útil para cosas que son costosas de crear, así se crean en el momento que se necesita.

En cuanto al código entre llaves, no sé muy bien cuando se ejecuta, si al referenciar la clase por primera vez (cuando el ClassLoader la carga) o en qué momento. Desde luego, en el momento que le de por ejecutarlo, inicializará los dos atributos a la vez.

Es cuestion de hacer una clase Taza con un System.out. en el constructor y probar en ambos casos cuándo se realiza el new de dicha clase.

Se bueno

Si lo haces con el código entre llaves no

mak
08 de Mayo del 2006
Hola,

yo estoy con Diego. Si ejecutáis este código:

public class T1 {

private static ClassA a = new ClassA("a");

private static ClassA a1;

static {
a1 = new ClassA("a1");
}

public static void main(String[] args) {

}

private static class ClassA {
private ClassA(String id) {
System.out.println("ClassA constructor: " + id);
}
}
}


esta es la salida:

ClassA constructor: a
ClassA constructor: a1