Corta y pega código con estilo
Lunes, 7 de Mayo de 2007Hay veces que tenemos que copiar y pegar, pero parece que Java nos pone trabas a ellos cuando resulta demasiado evidente.
Por ejemplo, supongamos este método de una clase ficticia:
public void chorrada() {
StringBuffer sb = new StringBuffer();
List temporal = new ArrayList();
for (int n = 0; n<10; n++) {
String hola = "hola";
sb.append(n).append(hola);
temporal.add(sb);
}
}
Un código absurdo, pero eso no importa. Ahora coge este código, cópialo y pégalo tres veces seguidas, asÃ:
public void chorrada() {
StringBuffer sb = new StringBuffer();
List temporal = new ArrayList();
for (int n = 0; n<10; n++) {
String hola = "hola";
sb.append(n).append(hola);
sb.append(n);
temporal.add(sb);
}
StringBuffer sb = new StringBuffer();
List temporal = new ArrayList();
for (int n = 0; n<10; n++) {
String hola = "hola";
sb.append(n).append(hola);
temporal.add(sb);
}
StringBuffer sb = new StringBuffer();
List temporal = new ArrayList();
for (int n = 0; n<10; n++) {
String hola = "hola";
sb.append(n).append(hola);
temporal.add(sb);
}
}
Si tienes un IDE moderno o compilas, verás que la segunda y tercera declaración de las variables sb y temporal fallan: “Variable sb is already define in the scope”, que viene a significar como que la variable ya está definida en el ámbito actual. ¿Y cuál es ese ámbito? El código del método, pero ¿porqué? pues porque está cerrado entre sus propias llaves {}. FÃjate que la variable hola está definida también tres veces, pero no falla al compilar. Eso es porqué su ámbito son las llaves {} del bucle for.
Bueno, una manera de evitar esto es añadirle unas llaves a nuestro código, sin más. AsÃ:
public void chorrada() {
{
StringBuffer sb = new StringBuffer();
List temporal = new ArrayList();
for (int n = 0; n<10; n++) {
String hola = "hola";
sb.append(n).append(hola);
sb.append(n);
temporal.add(sb);
}
}
{
StringBuffer sb = new StringBuffer();
List temporal = new ArrayList();
for (int n = 0; n<10; n++) {
String hola = "hola";
sb.append(n).append(hola);
sb.append(n);
temporal.add(sb);
}
}
{
StringBuffer sb = new StringBuffer();
List temporal = new ArrayList();
for (int n = 0; n<10; n++) {
String hola = "hola";
sb.append(n).append(hola);
sb.append(n);
temporal.add(sb);
}
}
}
Ahora cada fragmento tiene su propio ámbito, podemos definir cuantas variables que queramos dentro, que una vez finalice este ámbito definido por sus propias llaves {}, las variables desaparecerán.
Asà conseguiremos copiar y pegar con estilo, sin cambios, digno de un buen código spaghetti listo para sembrar el pánico, asà que usar con precaución e intentar evitarlo… pero si no hay más remedio…
















Mayo 7th, 2007 2:57 pm
Hola:
¡Buff!. Probecito del que vea el código luego. Como no sea un poco astuto….
Se bueno.
Mayo 7th, 2007 8:50 pm
Pues me llego a encontrar yo este código antes de leer esta entrada y me hubiera pegado un buen susto.
Mayo 9th, 2007 12:39 pm
Dios, espero que esto no llegue a conocimiento de algún copypaster…….
Octubre 4th, 2007 3:23 am
Hola querido amig@ acabo de leer tu articulo sobre “PL-SQL Oracle desde Java”, te cuento q he construido un paquete plsql que hace llamadas a otros paquetes (estos vienen por defecto en la base de datos y provee el funcionamiento de mi paquete).
Lo llamo desde sql*Plus y es correcto …
pero al llamar al mismo procedimento desde Java … me retorna resultados vacios …
Probando me di cuenta q lo q no ejecuta desde java es la llamada al metodo del otro paquete ( al q viene por defecto en la BD)….
Asi que dedusco q es problema de privilegios.. sera esto posible???…..podrias ayudarme??
Atte. Dabeyva Mejia T.
Santa Cruz — Bolivia