Apex Academy
Módulo 5·03·20 min

Constructores

El código que se ejecuta solo al hacer new: deja cada instancia lista para usar, como los valores por defecto de un campo al pulsar New.

En Admin esLos valores por defecto que aparecen al pulsar New en un registro

✓ En esta sub-lección

  1. 01Escribir un constructor con parámetros y reconocer que no lleva tipo de retorno.
  2. 02Dejar cada instancia en un estado válido desde el principio, sin listas a null.
  3. 03Saber cuándo deja de existir el constructor vacío que Apex pone por ti.

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

Haces Opportunity b = a; y luego b.StageName = 'Closed Lost';. ¿Qué pasa con a.StageName?

En la lección anterior fabricabas un WorkTicket vacío y después rellenabas sus campos uno a uno. Si olvidabas uno, quedaba en null y un método podía fallar más tarde. Un constructor resuelve eso: es el código que se ejecuta automáticamente al hacer new, y su trabajo es entregar una instancia lista para usar.

La nutria: El paralelo de Admin

Yo lo entendí pensando en el botón New de una oportunidad: algunos campos ya vienen rellenos. El propietario eres tú, la divisa es la de tu usuario, un picklist trae su valor por defecto. Nadie los escribió: los puso la definición del objeto al crear el registro. El constructor es ese momento, escrito en código.

Anatomía de un constructor

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

    // Constructor: mismo nombre que la clase, sin tipo de retorno
    public SupportPlan(String planLevel) {
        level = planLevel;
        startDate = Date.today();
        contacts = new List<String>();   // nunca null
        hoursIncluded = planLevel == 'Gold' ? 40 : 10;
    }
}

SupportPlan plan = new SupportPlan('Gold');   // el constructor se ejecuta aquí
plan.contacts.add('ana@acme.com');             // funciona: la lista ya existe
  • Se llama exactamente igual que la clase, con la misma mayúscula.
  • No lleva tipo de retorno, ni siquiera void. Si le pones void, deja de ser un constructor y pasa a ser un método normal que nadie llama.
  • Lo que va entre los paréntesis de new SupportPlan('Gold') son los argumentos que recibe.
new SupportPlan('Gold')
goldPlan = ?

EL OBJETO EN MEMORIA

  • levelnull
  • startDatenull
  • contactsnull
  • hoursIncludednull

Paso 1 de 6

new reserva un objeto vacío: todos sus atributos empiezan en null.

new reserva el objeto, el constructor lo rellena y solo entonces la variable recibe el enlace.

Un objeto válido desde el primer segundo

Recuerda del Módulo 1 que todo empieza en , también las listas. Un atributo List<String> contacts; sin inicializar es null, y contacts.add(…) lanzaría una . El constructor es el sitio natural para crear las colecciones vacías y poner los valores por defecto, de modo que nadie que use la clase tenga que acordarse.

El constructor que Apex pone por ti… hasta que escribes uno

Si una clase no tiene ningún constructor, Apex le da uno vacío, sin parámetros: por eso new WorkTicket() funcionaba. En cuanto escribes un constructor con parámetros, ese vacío desaparece. Si también quieres permitir new SupportPlan(), tienes que escribirlo tú. Una clase puede tener varios constructores mientras sus parámetros sean distintos.

Apex
SupportPlan basic = new SupportPlan();   // ❌ no compila: ya no existe el constructor vacío

// Para permitirlo, se escribe explícitamente:
public SupportPlan() {
    level = 'Basic';
    startDate = Date.today();
    contacts = new List<String>();
    hoursIncluded = 5;
}
¿Ves las tres líneas repetidas entre los dos constructores? En la próxima lección aprenderás a no repetirlas.

Varios constructores, varias formas de nacer

Una clase puede tener más de un constructor, siempre que cada uno reciba parámetros distintos. Así ofreces varias formas de crear el objeto: la habitual, con los datos mínimos, y otra más completa para los casos especiales. Apex elige cuál ejecutar mirando lo que pasas al hacer new. Es tu primer contacto con la sobrecarga, que la lección 9 explica a fondo.

Apex
public SupportPlan(String planLevel) {
    // … el de siempre: las horas salen del nivel
}

public SupportPlan(String planLevel, Integer customHours) {
    // … para un contrato negociado: horas a medida
}

SupportPlan standard  = new SupportPlan('Silver');
SupportPlan negotiated = new SupportPlan('Gold', 60);

La nutria: Como las acciones rápidas con valores predefinidos

Yo configuré muchas de estas: en una cuenta puedes tener una acción «Nueva oportunidad de renovación» que ya rellena la etapa, el tipo y la fecha de cierre, y otra «Nueva oportunidad» que deja todo en blanco. Las dos crean una oportunidad, pero cada una la hace nacer distinta. Cada constructor es una de esas acciones: una forma de crear el objeto con los valores ya puestos, para que nadie tenga que acordarse de rellenarlos.