2010-12-14 9 views
18

Estoy refabricando un código heredado, pero me quedé perplejo por la decisión de diseño y no puedo encontrar los términos adecuados para google esto. Mi predecesor usaría bloques como este:En Java, ¿por qué tener un bloque de código sin palabras clave, solo llaves

public class ChildClass extends ParentClass { 
    { 
     inheritedVar = "someVal"; 
    } 

    public ChildClass(){ /* constructor exists */ } 
    // rest of code 
} 

¿Cuál es el punto de declarar un bloque de código sin palabra clave? No se comporta como un bloque estático, no lo creo. ¿Es una alternativa para establecer en el constructor? ¿Esto tendría algún efecto si se usara una fábrica (que en este caso no es así)? Encontré un hilo relacionado aquí en this happening in C pero el razonamiento (scope & declaración de variable) no parecía relevante para Java.

Cualquier pensamiento o idea sobre el "por qué" de esto sería apreciado. Es bastante fácil volver a factorizar esto, solo tengo curiosidad en este punto.

Respuesta

29

Es un bloque de inicialización. (Relacionado con el bloque inicializador estático) Consulte Inicialización Instancia Miembros en esta página:

http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

Es una alternativa a un constructor. Podría usarlo cuando proporcione constructores múltiples sobrecargados como una forma de compartir código.

Personalmente, sin embargo, me parece mucho más claro que el constructor llame a un método de inicializador con nombre en lugar de depender del bloque de código anónimo. Aunque, el compilador copia el bloque de inicializador a todos los constructores detrás de escena y se podría argumentar que hay un aumento de rendimiento similar a la incorporación de una declaración de método.

+1

+1 para indicar el uso correcto de este bloque. – birryree

+1

+1: Acepto los métodos de inicialización nombrados. Sin embargo, dado que solo hay un constructor, el objetivo de este bloque en mi base de código parece bastante inútil. – Riggy

+0

@Riggy, sin duda es redundante. – Mike

-3

Alcance. Cualquier variable declarada en el bloque sale del alcance después del bloque. Es útil para mantener las variables con un alcance mínimo.

Además, si define una clase interna anónima, usa esta sintaxis para el constructor.

+0

No del todo. Hubiera sido alcance, si hubiera estado dentro de un cuerpo de método. Esto es en el cuerpo de la clase, fuera de los métodos. Lee otras respuestas –

+0

-1 Esta es una respuesta incorrecta.En el caso dado, es un bloque de inicializador. –

16

Se llama initializer block.

inicializador bloques de variables de instancia se parecen a los bloques inicializador estático, pero sin la palabra clave estática:

{ 
     // whatever code is needed for initialization goes here 
    } 

Los bloques de Java copias del compilador de inicializador en cada constructor. Por lo tanto, este enfoque se puede usar para compartir un bloque de código entre múltiples constructores.

+0

Tanto usted como Mike dejaron excelentes respuestas, gracias a ambos por los enlaces. No había pensado en los múltiples constructores sobrecargados, dado que las diversas clases que he encontrado solo tienen un constructor cada una. – Riggy

+0

Un pequeño detalle: el compilador no copia el bloque inicializador, solo agrega una llamada del constructor al método especial , que es lo que {} se convierte en el archivo .class. [El bloque de inicializador estático se convierte en el método ]. –

4

Su predecesor todavía estaba aprendiendo.

Esa es la mejor explicación que es probable que obtenga. Tal vez en algún momento hubo una necesidad de dividir el código de esta manera. Es difícil de decir. El código debe ser escrito sin duda esta forma:

 
public class ChildClass extends ParentClass { 
    public ChildClass() { 
     inheritedVar = "someVal"; 
    } 
    // rest of code 
} 

En cuanto al bloque de inicialización, su propósito ha sido dada por las otras respuestas aquí. Lancé mi respuesta como un intento de responder al "por qué", que usted solicitó. Desafortunadamente, para la respuesta real, debería preguntarle a su predecesor.

+0

Solo había publicado la cantidad mínima de código para transmitir mi punto de vista sin cargar a los lectores de SO con el código de basura. Incluí el constructor solo para que fuera evidente que existe un constructor en el código y que el bloque sin nombre no estaba reemplazando al constructor. ¡Gracias! – Riggy

+0

No hay problema. Eliminé la parte de mi respuesta preguntando al respecto. –

+4

Tienes razón en que no es el mejor código. Sugeriría que el predecesor estaba aprendiendo. Hay tantos desarrolladores que llaman idiotas a otros desarrolladores, y todo lo que hacen es hacer que las personas oculten sus errores para que no se avergüencen o, peor aún, despedidos. Preferiría ver "Tu predecesor aún estaba aprendiendo a codificar bien". Tengo la misión de crear entornos seguros para que los desarrolladores aprendan las formas correctas de hacer las cosas, y tengo la firme convicción de que StackOverflow debería ser uno de ellos: ¿estarías dispuesto a ayudar y cambiar el idioma que usas? – Lunivore

Cuestiones relacionadas