[Las cosas que no interesan]

pageicon martes jun 05, 2007

Y yo que creía que no se podía

NOMBRES DE VARIABLES 

Alguna vez me pregunté si una variable podía tener el mismo nombre de una clase del paquete java.lang o en general, ¿una variable puede tener el mismo nombre de una clase que se esté importando?. A ver:

package whatyoubelievedyoucouldnot;
import javax.swing.JButton;
public class VariableName {
    public static void main(String[] args) {
        String Integer = "Hola Paco";
        System.out.println("Tamanio: " + Integer.length());
        System.out.println("Texto: " + Integer);

        Integer JButton = Integer.length()*2;
        System.out.println("JButton: " + JButton);
    }
}

Si se compila y ejecuta la clase anterior la salida será:

Tamanio: 9
Texto: Hola Paco
JButton: 18

Pues resulta que sí, si se puede usar el nombre de cualquier clase como variable. ¿Pero qué pasa si necesito usar la clase java.lang.Integer?, pues eso, hay que cualificarla completamente:

System.out.println(java.lang.Integer.toHexString(0xCAFE));
String unNumero = "666";
Float Float = java.lang.Float.parseFloat(unNumero);

Aunque el código es como para moler a golpes quien lo haga, según las reglas no hay razón por la que no se puedan usar estos nombres ya que no son palabras reservadas y tienen nombres válidos.

Eso sí, según las buenas prácticas los nombres de variables y atributos deben empezar con letras minusculas, pero esto no es ningún impedimento para que una clase compile.

NOMBRES DE CLASES
¿Y qué hay sobre las clases?, pues lo mismo, como el nombre es válido, puedo hacer lo mismo. Veamos la siguiente obra de arte:

package whatyoubelievedyoucouldnot;
public class Thread {

    @Override
    public String toString(){
        return "Soy un hilo farsante";
    }

    public static void main(String[] args) {
        Thread Thread = new Thread();
        System.out.println(Thread.toString());
    }
}

También asesinaría a quien cometa este tipo de aberración, pero es válida. La salida al ejecutar este programa es "Soy un hilo farsante", por qué el método toString() que se ejecuta es el de la clase 'whatyoubelievedyoucouldnot.Thread'. ¿Qué tal si queremos un hilo de los 'verdaderos'?

package whatyoubelievedyoucouldnot;
public class Thread {

    @Override
    public String toString(){
        return "Soy un hilo farsante";
    }

    public static void main(String[] args) {
        java.lang.Thread Thread = new java.lang.Thread();
        System.out.println(Thread.toString());
    }
}

Igual, se cualifica la clase completamente para diferenciarla de la actual.

Hemos visto verdaderas obras del desastre y la confusión, supongo que si todo el código que hiciéramos fuera así, nadie se atrevería a ser programador. Aunque se ven tantas cosas...

Bien, y ¿qué pasa si hago una clase llamada Thread dentro de un paquete java.lang?, pues ese asunto ya toca con classloaders, el orden en que se cargan las clases, etc. algo para probar en casa y con lo que no me quiero meter.

Comentarios:

Lo que no se puede es pasarle el super de una clase a otra por parametros, lo he intentado y no me ha dejado el compilador.

Enviado por batch4j en junio 07, 2007 a las 12:07 PM COT #

No entiendo bien lo que quieres decir. ¿Puedes poner un ejemplo?

Saludos

Enviado por azuluaga en junio 07, 2007 a las 12:24 PM COT #

Enviar un comentario:
Los comentarios han sido deshabilitados.