Constructores y palabra clave this en Java

Un constructor es un método especial que se ejecuta cuando creamos un objeto. Cuando lo declaramos, la diferencia con los métodos normales, es que no lleva tipo de retorno y su nombre es el mismo que el de la clase. Ej:

class Persona {
	public Persona() {   ….   }
	public Persona(String nombre) {   ….   }
}

Pueden existir varios constructores en una clase si tienen diferentes listas de parámetros. Dos listas de parámetros son diferentes si no coinciden en el orden y el tipo de sus parámetros.

Constructores y new

Dependiendo de cómo se crea el objeto, se llamará a uno u otro constructor.

Si creamos un objeto con:

Si no existe el método cuyos parámetros coincidan con los argumentos de la llamada new, se presentará un error.

Constructor vacío

El constructor sin parámetros es llamado constructor vacío. Si no se define ningún constructor, el compilador crea un constructor por defecto. Esto permite crear objetos con “new Clase()” sin argumentos, aunque no se defina ningún constructor.

Muchos frameworks y herramientas necesitan que definamos objetos con constructores vacíos. Un error común, es agregar un segundo constructor y olvidar que esto hace que el compilador no cree el constructor vacío.

Palabra clave this

Un método miembro de un objeto está asociado al objeto. Cuando este se está ejecutando podemos usar this, para conseguir una referencia al objeto asociado.

Dentro del método, podemos usar this.nombre para acceder al nombre del objeto asociado.

La palabra clave this, funciona igual dentro de un constructor.

 


Ejemplo de uso de constructores y this

package com.edu4java.javatutorials;

class Persona {
	String nombre;
	String apellido;
	String direccion;

	public Persona() {
		this.nombre = "No informado";
		this.apellido = "No informado";
		this.direccion = "No informado";
	}

	public Persona(String nombre) {
		this();
		this.nombre = nombre;
	}

	public Persona(String nombre, String apellido, String direccion) {
		super();
		this.nombre = nombre;
		this.apellido = apellido;
		this.direccion = direccion;
	}

	public String toString() {
		return "Persona = " + this.nombre + " " + apellido + " - Dir: " + direccion;
	}

	public static void main(String[] args) {
		Persona p1 = new Persona();
		Persona p2 = new Persona("Edu");
		Persona p3 = new Persona("Pepe", "Garcia", "Gran Via 14");
		System.out.println(p1.toString());
		System.out.println(p2.toString());
		System.out.println(p3.toString());
	}
}

En el método toString usamos this para acceder al campo nombre. En realidad esto no es necesario como vemos en la misma línea cuando accedemos al campo apellido. Por defecto el compilador entiende que es el campo del objeto asociado.

	public Persona(String nombre, String apellido, String direccion) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.direccion = direccion;
	}

Donde si es necesario usar this es en Persona(String nombre, String apellido, String direccion), donde existe un parámetro llamado nombre. Si escribimos sólo "nombre", el compilador entiende que nos referimos al parámetro y no al campo. Por eso se usa this.nombre = nombre;

	public Persona(String nombre) {
		this();
		this.nombre = nombre;
	}

Otro caso interesante donde usar this, es en el constructor Persona(String nombre). Aquí se llama al constructor informando sólo el nombre. Queremos que los demás campos tengan el contenido por defecto dado por el constructor vacio "No informado". Usamos this(), para llamar al constructor vacio public Persona(), desde el constructor Persona(String nombre). Esto rellena todos los campos con "No informado” y luego actualiza el nombre con el parámetro.  

	Persona p1 = new Persona();
	Persona p2 = new Persona("Edu");
	Persona p3 = new Persona("Pepe", "Garcia", "Gran Via 14");
	System.out.println(p1.toString());
	System.out.println(p2.toString());
	System.out.println(p3.toString());

En el método main, podemos ver como creamos tres objetos personas, usando los diferentes constructores y después imprimimos cada uno de los objetos, usando el método toString().