La Palabra Clave this en Java

La Palabra Clave this en Java

1. Introducción

En este tutorial, echaremos un vistazo a la palabra clave this en Java.

En Java, la palabra clave this es una referencia al objeto actual cuyo método se está llamando.

Exploraremos cómo y cuándo podemos usar esta palabra clave.

2. Desambiguación de Sombreado de Campos

La palabra clave this es útil para desambiguar y diferenciar las variables de instancia de los parámetros locales. La razón más común es cuando tenemos parámetros de constructor con el mismo nombre que los campos de instancia:

public class PruebaPalabraClave {

    private String nombre;
    private int edad;
    
    public PruebaPalabraClave(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
}

Como podemos ver aquí, estamos usando this con los campos nombre y edad de instancia para distinguirlos de los parámetros.

Otro uso es utilizar this con el ocultamiento o sombreado de parámetros en el ámbito local.

3. Referencia a Constructores de la Misma Clase

Desde un constructor, podemos usar this() para llamar a un constructor diferente de la misma clase. Aquí, usamos this() para la concatenación de constructores y reducir el uso de código.

El caso de uso más común es llamar a un constructor por defecto desde un constructor parametrizado:

public PruebaPalabraClave(String nombre, int edad) {
    this();
    
    // el resto del código
}

O podemos llamar al constructor parametrizado desde el constructor sin argumentos y pasar algunos argumentos:

public PruebaPalabraClave() {
    this("Manu", 31);
}

Ten en cuenta que this() debe ser la primera declaración en el constructor, de lo contrario, se producirá un error de compilación.

4. Pasar this como Parámetro

Aquí tenemos el método imprimirInstancia(), donde se define el argumento thisPalabraClave:

public PruebaPalabraClave() {
    imprimirInstancia(this);
}

public void imprimirInstancia(PruebaPalabraClave thisPalabraClave) {
    System.out.println(thisPalabraClave);
}

Dentro del constructor, invocamos el método imprimirInstancia(). Con this, pasamos una referencia a la instancia actual.

5. Devolver this

También podemos usar la palabra clave this para devolver la instancia de la clase actual desde el método.

Aquí tienes un ejemplo práctico completo de cómo se implementa en el patrón de diseño constructor (builder). Este ejemplo tiene solo una clase, CuentaBancaria, que contiene un constructor como una clase interna static:

public class CuentaBancaria {
    
    private String nombre;
    private String numeroCuenta;
    private String correoElectronico;
    private boolean boletín;

    // constructores/getters
    
    public static class BuilderCuentaBancaria {
        // código del builder
    }
}

Observa que todos los modificadores de acceso en los campos se declaran como private, ya que no queremos que los objetos externos accedan a ellos directamente.

El constructor también es private para que solo el Builder asignado a esta clase pueda acceder a él. Todas las propiedades establecidas en el constructor se extraen del objeto constructor que proporcionamos como argumento.

Hemos definido BuilderCuentaBancaria en una clase interna static:

public static class BuilderCuentaBancaria {
    
    private String nombre;
    private String numeroCuenta;
    private String correoElectronico;
    private boolean boletin;
    
    public BuilderCuentaBancaria(String nombre, String numeroCuenta) {
        this.nombre = nombre;
        this.numeroCuenta = numeroCuenta;
    }

    public BuilderCuentaBancaria conCorreoElectronico(String correoElectronico) {
        this.correoElectronico = correoElectronico;
        return this;
    }

    public BuilderCuentaBancaria desearBoletin(boolean boletin) {
        this.boletin = boletin;
        return this;
    }
    
    public CuentaBancaria construir() {
        return new CuentaBancaria(this);
    }
}

Observa que hemos declarado el mismo conjunto de campos que contiene la clase externa. Cualquier campo obligatorio se requiere como argumentos para el constructor de la clase interna, mientras que los campos opcionales restantes se pueden especificar mediante los métodos establecedores.

Esta implementación también admite el enfoque de diseño fluido al hacer que los métodos establecedores devuelvan el objeto builder.

Finalmente, el método de construcción llama al constructor privado de la clase externa y se pasa a sí mismo como argumento. La CuentaBancaria devuelta se instanciará con los parámetros establecidos por el BuilderCuentaBancaria.

Veamos un ejemplo rápido del patrón builder en acción:

CuentaBancaria nuevaCuenta = new CuentaBancaria
  .BuilderCuentaBancaria("Toni", "55318560231")
  .conCorreoElectronico("[email protected]")
  .desearBoletin(true)
  .construir();

6. La Palabra Clave this Dentro de la Clase Interna

También usamos 'this' para acceder a la instancia de la clase externa desde dentro de la clase interna:

public class PruebaPalabraClave {

    private String nombre;

    class EstaClaseInterna {

        boolean esClaseInterna = true;

        public EstaClaseInterna() {
            PruebaPalabraClave thisPalabraClave = PruebaPalabraClave.this;
            String cadenaExterna = PruebaPalabraClave.this.nombre;
        }
    }
}

Aquí, dentro del constructor, podemos obtener una referencia a la instancia de PruebaPalabraClave con la llamada a PruebaPalabraClave.this. Incluso podemos acceder a las variables de instancia como el campo PruebaPalabraClave.this.nombre.

7. Conclusión

En este artículo, hemos explorado la palabra clave this en Java en profundidad.