Apex Academy
Módulo 5·04·16 min

this: el objeto hablando de sí mismo

Dentro de una clase, this es «esta instancia». Sirve para distinguir un atributo de un parámetro con el mismo nombre y para que un constructor llame a otro.

En Admin es$Record en un Flow disparado por registro: «el registro que se está procesando»

✓ En esta sub-lección

  1. 01Usar this.atributo cuando un parámetro se llama igual que un atributo.
  2. 02Encadenar constructores con this(…) para no repetir código.
  3. 03Reconocer el error silencioso de asignar un parámetro a sí mismo.

La nutria: ¿Te acuerdas? · Repaso de la lección 3

¿Qué tipo de retorno lleva un constructor?

Dentro de un método, a veces necesitas hablar de la instancia sobre la que se está ejecutando: «mi nivel», «mis horas». Apex tiene una palabra para eso: this. No es un concepto nuevo, solo le pone nombre a algo que ya estabas haciendo.

La nutria: El paralelo de Admin

En mis Flows disparados por registro escribía $Record.Amount para decir «el importe del registro que ha disparado este Flow». Da igual qué registro sea: $Record siempre es el actual. this es lo mismo dentro de una clase: la instancia sobre la que se ha llamado el método o el constructor.

Uso 1: cuando el parámetro se llama igual

En la lección anterior el parámetro se llamaba planLevel para no chocar con el atributo level. Lo natural es llamarlos igual, pero entonces dentro del constructor level significa el parámetro, porque es lo más cercano: el más interior gana. this.level deja claro que hablas del atributo de la instancia.

Apex
public class SupportPlan {
    public String level;

    public SupportPlan(String level) {
        level = level;        // ❌ asigna el parámetro a sí mismo: el atributo sigue null
        this.level = level;   // ✅ atributo de esta instancia = parámetro
    }
}
level = level; compila sin quejarse y no hace nada. Es de los errores más difíciles de ver, porque no avisa.
public SupportPlan(String level) { level = level; }

EL PARÁMETRO level

  • valor'Gold'
  • vivesolo dentro del constructor

EL ATRIBUTO this.level

  • valornull
  • vivelo que viva el objeto

Dentro del constructor, level a secas es el parámetro, que tapa al atributo. level = level; copia el parámetro en sí mismo, compila sin avisar… y el atributo sigue en null.

Dentro del constructor hay dos level: el parámetro, que tapa al otro, y el atributo, al que se llega con this.

Uso 2: un constructor que llama a otro

La lección anterior terminó con dos constructores que repetían tres líneas. this(…), escrito como primera línea de un constructor, llama a otro constructor de la misma clase. Así la lógica vive en un único sitio y los demás constructores solo aportan sus valores por defecto.

Apex
public class SupportPlan {
    public String level;
    public Date startDate;
    public List<String> contacts;

    public SupportPlan(String level) {
        this.level = level;
        this.startDate = Date.today();
        this.contacts = new List<String>();
    }

    public SupportPlan() {
        this('Basic');        // «hazlo como el otro, con nivel Basic»
    }
}
this(…) tiene que ser la primera línea del constructor. Si cambia la forma de crear un plan, solo se toca un constructor.

this como argumento: el objeto se presenta a otro

this no solo sirve para distinguir un atributo de un parámetro. También puedes pasarlo como argumento, cuando un objeto necesita entregarse a sí mismo a otro código: «apúntame en el registro de auditoría», «añádeme a esta lista». Y un método puede devolver this al terminar, para que se puedan encadenar llamadas sobre el mismo objeto, como encadenabas métodos de String en el Módulo 1. Lo verás mucho en el Módulo 10, en las clases que fabrican datos de prueba.

Apex
public class SupportPlan {
    public List<String> contacts = new List<String>();

    public SupportPlan addContact(String email) {
        this.contacts.add(email);
        return this;   // devuelve el mismo objeto…
    }
}

// …así que las llamadas se encadenan
SupportPlan plan = new SupportPlan('Gold')
    .addContact('ana@northwind.com')
    .addContact('luis@northwind.com');

La nutria: Pasar $Record a un subflow

Esto lo hacía a menudo: en un Record-Triggered Flow, cuando llamas a un subflow y le das $Record como variable de entrada, le estás diciendo «trabaja con este registro, el que me disparó a mí». Pasar this a otro método es exactamente eso: el objeto se entrega entero al código que lo necesita, sin copiar sus campos uno a uno.