2012-02-17 25 views

Respuesta

53

Es solo escribir dos bloques de código diferentes para ocultar las variables locales.

De la respuesta a la pregunta "Anonymous code blocks in Java":

Bloques restringir el ámbito de las variables.

public void foo() 
{ 
    { 
     int i = 10; 
    } 
    System.out.println(i); // Won't compile. 
} 

En la práctica, sin embargo, si usted se encuentra con un bloque de dicho código a continuación Es probablemente una señal de que desea refactorizar ese bloque a un método .

+7

No es broma. Este es uno de estos "ingeniosos trucos de Java" que aparecen en un entorno académico o en pruebas de certificación, pero que los desarrolladores profesionales de Java probablemente nunca usarían. –

+16

En realidad, es muy útil en unos pocos casos para garantizar que los bloques adyacentes de código sean realmente independientes, para evitar errores de cortar y pegar, y para evitar cambios innecesarios al reordenar bloques. – DNA

+0

Sí, muy útil para copiar y pegar de forma rápida y sucia;] – davidfrancis

6

Nada. Ellos declaran bloques de código. Normalmente no los usarías. La única diferencia será si declara una variable en la primera, no estará accesible en la segunda.

10

Los dos bloques son independientes. Por lo tanto, cualquier variable que pueda tener en el primer bloque no será accesible en el segundo bloque, o en cualquier lugar fuera del primer bloque. Se llama código aislamiento o scoping.

4

Los dos bloques se ejecutan secuencialmente. Cada bloque define un nuevo alcance para las variables locales. Entonces podría tener

int i; 

en ambos bloques.

7

introduce un alcance y las variables declaradas dentro del alcance existen solo para ese alcance. Por ejemplo:

if (test) { 

    int i = 0; 


    float i = 0; 
} 

fracasarían para compilar como i ha sido declarado dos veces en el mismo ámbito.

if (test) { 
    { 
     int i = 0; 
    } 

    {  
     float i = 0; 
    } 
} 

podría compilarse bien como i no se ha declarado dos veces en el mismo ámbito.

21

Dos ejemplos en los que esto puede ser (un poco) de utilidad - en las pruebas unitarias, y en interfaces gráficas de usuario, los cuales a menudo implican código repetitivo:

Es útil en la construcción de interfaz gráfica de usuario, donde es muy fácil de CUT y pegar líneas en relación con un componente y se olvide de actualizar ellos para el nuevo componente, lo que conduce a errores difíciles de encontrar, por ejemplo:

JButton button1 = new JButton("OK"); 
    button1.setEnabled(false); 
    button1.setAlignmentX(-1); 

    JButton button2 = new JButton("Apply"); 
    button1.setEnabled(false); 
    button1.setAlignmentX(-1); 

Vaya, acabo de configurar button1 dos veces. Si coloca cada botón en su propio bloque, el compilador recogerá este error.Una vez más, se podría crear cada botón en un método separado, pero que puede hacer que sea difícil ver lo que está pasando (especialmente teniendo en cuenta la falta de parámetros de palabras clave en Java):

JButton button_ok = makeButton("OK", false, -1); 
JButton button_apply = makeButton("Apply", true, 1); 
// what exactly is being set here? 

... 

// much later: 
private static JButton makeButton(String name, boolean enabled, 
     int alignment) 
{ 
    JButton button = new JButton(name); 
    button.setEnabled(enabled); 
    button.setAlignmentX(alignment); 
    return button; 
} 

... y puede terminar con numerosos métodos, cada uno de los cuales maneja diferentes variaciones de parámetros, y cada uno solo se puede usar dos veces.

+1

Errores como este son muy molestos. Podría ver las llaves siendo útiles temporalmente aquí. También puede ser útil durante la refabricación y la limpieza, pero probablemente es mejor eliminarlo en el código final. También pueden ser útiles si deseas ser realmente controvertido y continuar o romper dentro del bloque. – davidfrancis

+3

También puede ser útil si está generando código y no desea declarar accidentalmente una variable dos veces si incluye el mismo nodo dos veces en una secuencia de comandos en particular. Nuestro equipo de Automatización de Pruebas ha encontrado errores como ese. – Yamikuronue

+0

Usar un constructor es probablemente una mejor solución para este caso: le daría una mejor legibilidad y eliminaría la clase de error que está tratando de evitar, – ireddick

4

Esos son bloques anónimos. Se usan para limitar el alcance. No solo en Java, sino en otros lenguajes como C# y C.

Cuestiones relacionadas