Clases y objetos
Una clase es la definición de un objeto en Object Manager; un objeto es un registro. Ahora vas a crear tus propias definiciones, con sus campos y sus acciones.
✓ En esta sub-lección
- 01Escribir una clase con atributos y un método que devuelve un valor.
- 02Crear instancias con new y leer o cambiar sus atributos con el punto.
- 03Explicar por qué cada instancia tiene sus propios valores.
La nutria: ¿Te acuerdas? · Repaso del Módulo 4
¿Qué hace Database.update(escalated, false) si uno de 200 casos no se puede actualizar?
Hasta ahora has usado objetos que Salesforce ya había definido: Account, Opportunity, Case. En el Módulo 1 viste que Account es un molde y que new Account() fabrica una fila nueva. Esta lección da el paso siguiente: escribir tus propios moldes. Eso es una , y es la base de todo el código Apex que existe en una org.
La nutria: El paralelo de Admin
LA CLASE · el molde, una vez
- Stringsubject
- DecimalhoursSpent
- BooleanisBillable
- Decimalcost(rate)
migration · objeto
- subject'Migración de datos'
- hoursSpent6
- isBillabletrue
Cada new fabrica un objeto nuevo con los mismos campos y sus propios valores, como cada registro de un objeto de Object Manager. Fabrica dos o tres y luego llama al método.
Anatomía de una clase
public class ServiceTicket {
// Atributos: los «campos» de la clase
public String subject;
public Decimal hoursSpent;
public Boolean isBillable;
// Método: una «acción» que usa los atributos
public Decimal cost(Decimal hourlyRate) {
if (isBillable != true || hoursSpent == null) {
return 0;
}
return hoursSpent * hourlyRate;
}
}- public class ServiceTicket { … } declara la clase. Su nombre empieza por mayúscula, como Account: es un tipo.
- Los atributos se declaran como las variables del Módulo 1, pero dentro de la clase. Todavía no tienen valor: cada instancia pondrá el suyo.
- Un método tiene tipo de retorno (Decimal), nombre (cost), parámetros entre paréntesis (Decimal hourlyRate) y un bloque. return devuelve el valor y termina el método.
- Si un método no devuelve nada, su tipo de retorno es void, como el de System.debug.
Fabricar y usar objetos
ServiceTicket migration = new ServiceTicket();
migration.subject = 'Migración de datos';
migration.hoursSpent = 6;
migration.isBillable = true;
ServiceTicket training = new ServiceTicket();
training.subject = 'Formación interna';
training.hoursSpent = 3;
training.isBillable = false;
System.debug(migration.cost(80)); // 480
System.debug(training.cost(80)); // 0El mismo método da resultados distintos porque cada instancia tiene sus propios valores: cuando cost() lee hoursSpent, lee el de la instancia sobre la que lo llamaste. Es lo mismo que un campo fórmula: una única definición, un resultado distinto en cada registro.
Una clase no es un objeto personalizado
Es la confusión número uno de un Admin que empieza con Apex. Un objeto personalizado crea una tabla: sus registros se guardan y salen en vistas de lista e informes. Una clase no crea nada de eso: es un molde que vive en el código, y sus objetos existen en memoria mientras dura la transacción. Si quieres que algo quede guardado, pasas los datos a un sObject y haces DML, como en el Módulo 4.
| En Object Manager | En una clase de Apex | La diferencia |
|---|---|---|
| Campos | Atributos | Los atributos no se guardan solos en la base de datos. |
| Campo fórmula | Método que calcula y devuelve | El método puede hacer mucho más que una fórmula: bucles, consultas, otros objetos. |
| Registro | Objeto (instancia) | La instancia vive en memoria; el registro, en la base de datos. |
| Vista de lista, informe, layout | Sin equivalente | El usuario no ve tus objetos hasta que los muestras en una pantalla o los guardas. |
La nutria: Entonces, ¿para qué sirve una clase?
El encargo de este módulo
La nutria: Las doce piezas, en el orden en que se construyen
La nutria: ¿Y por qué no un Flow? Porque en Flow no hay clases