Hay 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…