Diario de un Aprendiz de Java

Saturday, May 28, 2005

Las palabras reservadas THIS y SUPER

Después de un tiempo sin postear (y sin dedicarle demasiado a Java) por culpa de determinadas obligaciones académicas, vuelvo a la carga para explicar una cosa muy sencilla.
Java nos da estas herramientas para poder hacer nuestro codigo más entendible. La palabra reservada this permite especificar que la variable que señala (y la señala haciendo this.nombreVariable) es de la misma clase en la que se usa.
Os podeis preguntar .. ¿para que me sirve esto, si ya se sobreentiende? ¡Yo nunca voy a usar dos variables con el mismo nombre!
Pues yo os voy a comentar un caso en el que this nos permite crear codigo mucho más facil de entender para aquel que lo lee (y por tanto, más sencillo para nosotros cuando lo tengamos que releer/modificar/mejorar). Mirad el siguiente codigo :
class RGB {
  int red, green, blue;

  RGB(int red, int green, int blue) {
   this.red = red;
   this.green = green;
   this.blue = blue;
  }
}

Como veis, el nombre de los argumentos que se pasan en el constructor son los mismos que las variables de la clase, así que para asignar los valores sin hacer tonterias (tipo red = red, :D) debemos usar this. En este caso, el poder usar los nombres red/green/blue en los argumentos nos permite evitar comentar el codigo para indicar que eso es el constructor principal y tal (como nos pasaría si hicieramos algo como RGB(int x, int y, int z)), ya que solo dandole un vistazo al codigo se entiende perfectamente su función.

No me cansaré de decirlo. Para lograr un buen source es importante no repetir fragmentos de codigo, usar tipos de variables acorde a la necesidad (si vas a hacer un bucle que solo se repita 50 veces, ¿porque usar un int como contador, cuando puedes usar un byte y ahorrar memoria?), establecer nombres de variables que expresen con claridad lo que van a contener, y comentar solo cuando haga falta. Estas son las claves más sencillas, pero también las más fundamentales.

La palabra reservada super sirve para indicar que una variable o un método es de la superclase (espero que os acordeis de nuestra querida heréncia :D). Os pongo un codigo para que entendais su uso
class SuperClase {
  boolean variableBool;

  void setVariableBool() {
   variableBool = true;
  }
}

class SubClase extends SuperClase {
  boolean variableBool;

  void setVariableBool() {
   variableBool = false;
   super.setVariableBool();

   System.out.println("La variable de aqui es " + variableBool);
   System.out.println("La de la superclase es " + super.variableBool);
  }
}

class Codigo {
  public static void main(String[] args) {
   SubClase objetoPrueba = new SubClase();
   objetoPrueba.setVariableBool();
  }
}

Como veis, en este codigo la superclase y la subclase tienen una variable y un método que tienen el mismo nombre, pero que hacen funciones diferentes, y los distingimos usando super.
Aún asi, el poner el mismo nombre a dos variables diferentes no es una buena manera de hacer las cosas, porque puede llevar a confusiones, e incluso el JavaCompiler nos indica warning cuando compilamos el codigo

servomac@ubuntu:~/coding/java $ javac Codigo.java

Issued 1 semantic warning compiling "Codigo.java":

10. boolean variableBool;
^----------^
*** Semantic Warning: Field "variableBool" shadows a field of the same name in "SuperClase".

De nuevo me limpio las manos, y dejo a elección del programador el uso de distintos métodos/variables con el mismo nombre.
Espero que tanto this como super os ayuden a entender un poco mejor a Java. ¡Saludos!

17 Comments:

Post a Comment

<< Home