2012-04-16 22 views
6

Estoy navegando a través de la fuente de Android, como que la estoy leyendo, y me he topado con una extraña porción de código en Android.Util.JsonReader. Es el siguiente:Peculiar Alcance de Java

private final List<JsonScope> stack = new ArrayList<JsonScope>(); 
{ 
    push(JsonScope.EMPTY_DOCUMENT); 
} 

¿Qué está haciendo esto exactamente? Es decir, el alcance inmediatamente siguiente a la asignación new? Si entiendo correctamente, cada vez que se crea una instancia de esta clase, JsonReader, (no estática, ¿no?), stack se inicializará aquí, en lugar de a través de this.stack = ... en el constructor, ¿correcto?

¿Qué hace el alcance? ¿Se ejecuta después de que se inicializa stack? Estoy un poco confundido aquí, en cuanto al nombre de este patrón y su uso.

Respuesta

5

No está relacionado con la nueva Declaración. Es un inicializador, algo así como un constructor sin nombre sin nombre.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6

Se ejecutan antes de que los constructores de una clase en orden textual

http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5

+0

¿Cuál es entonces lo activa? ¿Pueden ser múltiples y diferentes, presumiblemente después de diferentes campos de clase? – Josh

+0

Gracias, esos son algunos excelentes enlaces. Sin embargo, una pregunta, ¿por qué aparece inmediatamente después de ese campo en particular? ¿Es solo específico de esta clase? Hay ~ 6 campos que siguen a 'stack', antes del constructor de la clase, y aproximadamente el mismo monto que lo precede. – Josh

+2

Supongo que está ahí porque manipula el campo de pila a través de la llamada directa. –