Buscar este blog

lunes, 3 de mayo de 2010

Inicialización

Es posible imaginar la creación de un método denominado inicializar() para cada clase que se escriba.

El nombre se debe invocar antes de utilizar el objeto. Por desgracia, esto significa que el usuario debe recordar llamar al método. En Java, el diseñador de cada clase puede garantizar que se inicialice cada objeto proporcionando un método especial llamado constructor. Si una clase tiene un constructor, Java llama automáticamente al constructor cuando se crea un objeto, antes de que los usuarios puedan siquiera pensar en poner sus manos en él. Por consiguiente, la inicialización queda garantizada.

El siguiente reto es cómo llamar a este método. Hay dos aspectos. El primero es que cualquier nombre que se use podría colisionar con un nombre que nos gustaría utilizar como miembro en una clase. El segundo es que dado que el compilador es el responsable de invocar al constructor, debe saber siempre qué método invocar. La solución de C++ parece la mejor y más lógica, por lo que se utiliza también en Java: el nombre del constructor es el mismo que el nombre de la clase. Tiene sentido que un método así se invoque automáticamente en la inicialización.

He aquí hay una clase con un constructor simple:
class Piedra {
  Piedra() { // Éste es el constructor
    System.out.println("Creando Piedra");
  }
}

public class ConstructorSimple {
  public static void main(String[] args) {
    for(int i = 0; i < 10; i++)
      new Piedra();
  }
} 
Al crear un objeto:
new Piedra();
se asigna almacenamiento y se invoca al constructor. Queda garantizado que el objeto será inicializando de manera adecuada antes de poder poner las manos sobre él. Como cualquier método, el constructor puede tener parámetros para permitir especificar cómo se crea un objeto. El ejemplo de arriba puede cambiarse sencillamente de forma que el constructor reciba un argumento:
class Piedra2 {
  Piedra2(int i) {
    System.out.println(
      "Creando Piedra numero " + i);
  }
}

public class ConstructorSimple2 {
  public static void main(String[] args) {
    for(int i = 0; i < 10; i++)
      new Piedra2(i);
  }
}
Los parámetros del constructor proporcionan un medio para pasar parámetros a la inicialización de un objeto. Por ejemplo, si la clase Arbol tiene un constructor que toma un número entero que indica la altura del árbol, crearíamos un objeto Arbol como éste:
Arbol a = new Arbol(l2); // Un árbol de 12 metros

Si Arbol(int) es el único constructor, entonces el compilador no permitirá crear un objeto Arbol de ninguna otra forma.

El constructor es un tipo inusual de método porque no tiene valor de retorno. Esto es muy diferente al valor de retorno void, en el que el método no devuelve nada pero se sigue teniendo la opción de hacer que devuelva algo más. Los constructores no devuelven nada y no es necesario tener ninguna opción. Si hubiera un valor de retorno, y si se pudiera seleccionar el propio, el compilador, de alguna manera, necesitaría saber qué hacer con ese valor de retorno.

No hay comentarios:

Publicar un comentario