Access Modifiers
private, public, protected y global deciden quién ve cada pieza de una clase. Encapsular es exponer acciones seguras en lugar de campos que cualquiera puede romper.
✓ En esta sub-lección
- 01Elegir el modificador de acceso adecuado para cada atributo y método.
- 02Usar propiedades con { get; private set; } para exponer un valor en solo lectura.
- 03Proteger el estado de un objeto con métodos que validan, como una regla de validación.
La nutria: ¿Te acuerdas? · Repaso de la lección 5
¿Cómo llamas a un método static withVat de la clase PricingUtils?
Hasta ahora todo era public: cualquiera podía escribir ticket.hoursSpent = -40; y nadie lo impedía. En un equipo real, tu clase la usarán otras personas y otros procesos. Los modificadores de acceso deciden qué pueden tocar desde fuera, y eso es lo que mantiene los datos coherentes.
La nutria: El paralelo de Admin
Los cuatro niveles
| Modificador | Quién lo ve | En Salesforce sería… |
|---|---|---|
| private | Solo la propia clase | Un campo oculto para todos los perfiles |
| protected | La clase y las que heredan de ella | Visible solo para una «familia» de perfiles |
| public | Todo el código de tu org | Visible para todos los usuarios internos |
| global | También código de fuera: paquetes, integraciones | Publicado en una API para terceros |
Si no escribes nada delante de un atributo o método, Apex lo trata como private. La clase en sí, si es de primer nivel, tiene que ser public o global para que alguien la pueda usar. protected tendrá sentido en la próxima lección, con la herencia; global solo lo necesitarás si publicas un paquete o una API.
¿QUIÉN PREGUNTA?
private Boolean canAfford(…)private✗ invisibleprotected Decimal reserveprotected✗ invisiblepublic Decimal spent { get; }leer: public✓ lo vespent { private set; }escribir: private✗ invisiblepublic Boolean spend(…)public✓ lo veglobal Decimal remaining()global✓ lo ve
Cualquier otra clase solo ve lo public: puede LEER spent, pero para cambiarlo tiene que pasar por spend(), que comprueba el presupuesto. Es el Field-Level Security de «solo lectura».
Propiedades: leer sí, escribir no
A menudo quieres que un valor se pueda leer desde fuera pero solo lo cambie la propia clase, como un campo de solo lectura en el page layout que sí actualiza la automatización. Apex tiene una forma corta para eso: la propiedad. public Decimal balance { get; private set; } se lee desde cualquier sitio, pero solo se asigna dentro de la clase.
public class CreditLine {
public Decimal creditLimit { get; private set; }
public Decimal usedAmount { get; private set; }
public CreditLine(Decimal creditLimit) {
this.creditLimit = creditLimit;
this.usedAmount = 0;
}
// La única puerta para cambiar usedAmount: valida antes de tocar
public Boolean charge(Decimal amount) {
if (!fits(amount)) {
return false;
}
usedAmount += amount;
return true;
}
// Detalle interno: nadie de fuera necesita llamarlo
private Boolean fits(Decimal amount) {
return amount != null && amount > 0 && usedAmount + amount <= creditLimit;
}
}
CreditLine line = new CreditLine(5000);
line.charge(3000); // true
System.debug(line.usedAmount); // 3000: leer sí
line.usedAmount = 0; // ❌ no compila: escribir noEncapsular: la regla vive dentro, no fuera
La razón de fondo para hacer private un atributo no es esconder datos por gusto: es que la regla que lo protege esté en un solo sitio. Si spent fuera public, cada trozo de código que gasta tendría que acordarse de comprobar el presupuesto antes; basta que uno lo olvide para que el presupuesto se supere. Con spent de solo lectura y un único método spend() que comprueba, es imposible saltarse la regla, venga la llamada de donde venga. Eso se llama encapsular.
La nutria: Una regla de validación dentro del objeto
La nutria: global y los paquetes que instalas