sirven que para llaves las hacen como abrir java syntax scope curly-braces

hacen - para que sirven las llaves en java



¿Qué significan las llaves en Java en sí mismas? (11)

Tengo un código de Java que usa llaves de dos maneras

// Curly braces attached to an ''if'' statement: if(node.getId() != null) { node.getId().apply(this); } // Curly braces by themselves: { List<PExp> copy = new ArrayList<PExp>(node.getArgs()); for(PExp e : copy) { e.apply(this); } } outAMethodExp(node);

¿Qué significan esos aparatos ortopédicos autónomos después de la primera declaración if ?


Al traer un alcance, la copia no estará visible fuera de ella, por lo que puede declarar otra variable con el mismo nombre más adelante. Y puede ser recolectado por el recolector de basura justo después de salir de ese alcance. En este caso, la copia sirve como una variable temporal, por lo que es un buen ejemplo.


Como nota interesante: las llaves realmente permiten una clase de declaraciones: declaraciones.

Esto es ilegal: if(a) int f;

pero esto es legal: if(a) { int f; } if(a) { int f; }


Creo que solo definen un nivel de alcance sin nombre.


De hecho, supongo que alguien olvidó una declaración de otra persona.

Raramente hay una buena razón para molestarse en crear ámbitos de bloque adicionales. En esto, y en la mayoría de los casos, es mucho más probable que alguien haya olvidado escribir su declaración de control que decir que estaban haciendo algo inteligente.


Definen un nuevo ámbito, lo que significa que todo lo declarado en este ámbito no es visible fuera de las llaves.


El único propósito de las llaves adicionales es proporcionar alcance-límite. La List<PExp> copy solo existirá dentro de esas llaves, y no tendrá alcance fuera de ellas.

Si esto es código generado, supongo que el generador de código hace esto para que pueda insertar algún código (como este) sin tener que preocuparse por cuántas veces ha insertado una List<PExp> copy y sin tener que preocuparse por el posible cambio de nombre las variables si este fragmento se inserta en el mismo método más de una vez.


Ellos hacen un alcance interno. La variable declarada dentro de estas llaves no es visible fuera de ellas. Esto también se aplica a C / C ++.


En segundo lugar, escribí lo que matt b, y añadiré que otro uso que he visto de llaves anónimas es declarar un constructor implícito en clases anónimas. Por ejemplo:

List<String> names = new ArrayList<String>() { // I want to initialize this ArrayList instace in-line, // but I can''t define a constructor for an anonymous class: { add("Adam"); add("Eve"); } };

Algunos frameworks de pruebas unitarias han llevado esta sintaxis a otro nivel, lo que permite algunas cosas ingeniosas que parecen totalmente incompilables para funcionar. Dado que parecen desconocidos, yo no soy tan fanático, pero vale la pena al menos reconocer lo que sucede si se topa con este uso.


Estoy de acuerdo con la respuesta del límite de alcance, pero agregaría una cosa.

A veces se ve una construcción como esa en el código de personas a las que les gusta doblar secciones de su código y tienen editores que doblarán las llaves automáticamente. Lo usan para doblar su código en secciones lógicas que no caen en una función, clase, bucle, etc. que normalmente se plegarían.


Las llaves también son útiles para reducir el alcance en las declaraciones de interruptor / caja.

switch(foo) { case BAR: int i = ... ... case BAZ: int i = ... // error, "i" already defined in scope }

Pero puedes escribir

switch(foo) { case BAR:{ int i = ... ... } case BAZ:{ int i = ... // OK } }