Corta y pega código con estilo

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...

4 thoughts on “Corta y pega código con estilo

  1. Pues me llego a encontrar yo este código antes de leer esta entrada y me hubiera pegado un buen susto.

  2. 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

Comments are closed.