Apex Academy
Módulo 5·05·20 min

Static vs Non-Static

Lo que pertenece a cada instancia frente a lo que pertenece a la clase entera. Llevas usando métodos estáticos desde el Módulo 1 sin saberlo.

En Admin esUn campo de cada registro frente a un Custom Setting de toda la org

✓ En esta sub-lección

  1. 01Distinguir un miembro de instancia de uno estático y llamar a cada uno correctamente.
  2. 02Escribir una clase de utilidades con constantes y métodos estáticos.
  3. 03Saber cuánto vive una variable estática en Salesforce.

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

En un constructor con un parámetro level, ¿qué hace la línea level = level; sin this?

Todo lo que has escrito en este módulo pertenecía a una instancia: cada WorkTicket tenía sus horas, cada SupportPlan su nivel. Pero hay cosas que no son de ningún registro concreto: el tipo de IVA, una función que calcula un precio. Esas pertenecen a la clase, y se marcan con static.

La nutria: El paralelo de Admin

Así lo separo yo: un campo guarda un valor distinto en cada registro. Un Custom Setting de organización, o un registro de Custom Metadata, guarda un único valor para toda la org, que cualquiera puede consultar sin abrir ningún registro. Instancia = campo del registro. Static = ese valor compartido.

Ya los estabas usando

Date.today(), String.isBlank(name), Integer.valueOf('42'): en todos escribes el nombre de una clase, un punto y el método, sin ningún new delante. Son métodos estáticos. En cambio name.trim() o opp.clone() se llaman sobre una instancia concreta: son métodos de instancia.

LA CLASE · una sola vez

  • static finalVAT_RATE = 0.21
  • staticcreated = 1
  • transacción#1

instancia 1

  • hoursSpent6

Cada instancia tiene SUS horas; created y VAT_RATE existen una sola vez, en la clase, y los comparten todas. Como un campo de cada registro frente a un Custom Setting de toda la org.

Cada instancia tiene sus atributos; la parte estática existe una sola vez, en la clase, y la comparten todas.

Una clase de utilidades

Apex
public class PricingUtils {
    public static final Decimal VAT_RATE = 0.21;

    public static Decimal withVat(Decimal amount) {
        return (amount ?? 0) * (1 + VAT_RATE);
    }
}

// Se usa con el nombre de la clase, sin new
Decimal total = PricingUtils.withVat(1000);   // 1210
static final es la constante de toda la clase: un único valor, compartido y que no se puede cambiar.

Un método estático no trabaja sobre ninguna instancia, así que no puede leer atributos de instancia ni usar this: no hay «registro actual». Todo lo que necesita le llega por parámetro. Al revés sí funciona: un método de instancia puede usar las constantes y métodos estáticos de su clase.

De instanciaEstático
Pertenece a…cada objetola clase
Se llama…ticket.cost(95)PricingUtils.withVat(1000)
¿Hace falta new?SíNo
¿Puede usar this?SíNo

Cuánto vive una variable estática

Una variable estática (static, sin final) se puede cambiar y todo el código la ve con el mismo valor… pero solo durante una . Cuando termina el guardado que la creó, desaparece; el siguiente usuario empieza de cero. Eso la hace perfecta para recordar algo mientras dura un guardado (por ejemplo, «este trigger ya se ha ejecutado») y es justo lo que usarás en el Módulo 7.

¿Constante en el código o configuración en la org?

static final VAT_RATE = 0.21 es perfecto para algo que nunca cambia sin que cambie también el código. Pero si el valor lo decide el negocio (el IVA de otro país, el descuento máximo del trimestre), meterlo en una constante significa que cada cambio necesita un desarrollador y un despliegue. Para eso la plataforma tiene Custom Metadata Types y Custom Settings: el valor vive en la org, lo cambia un Admin desde Setup y el código lo lee. La regla: static final para lo que es parte de la lógica; metadatos para lo que es parte del negocio.

La nutria: Tú mismo pedirías esto

Si un desarrollador te dice «para cambiar el descuento máximo hay que desplegar», como Admin tienes derecho a quejarte; yo lo hice. Lo profesional es que ese valor esté en un registro de Custom Metadata que tú puedes editar, y que la clase lo lea. Saber distinguir qué va en una constante y qué va en configuración es lo que hace que el código no dependa de ti para cada cambio pequeño… ni tú de él.

La nutria: Static y los triggers del Módulo 7

Esto lo agradecerás más adelante: la guardia static Set<Id> que verás en el Módulo 7 funciona precisamente por lo que ves en esta lección. Una variable static es compartida por todo el código de la transacción, así que la segunda pasada del trigger ve los Ids que guardó la primera. Una variable de instancia no serviría: cada new CaseTriggerHandler() empieza con la suya, vacía.