Ce face static
Un câmp sau o metodă static ține de clasă, nu de un obiect anume. Există o singură copie a unui câmp static, comună tuturor obiectelor, și se accesează prin numele clasei: Elev.numarElevi, Matematica.patrat(3).
Metodele statice nu au this și nu pot folosi câmpurile obișnuite ale obiectelor. Sunt potrivite pentru funcții ajutătoare legate de clasă și pentru constante (static const).
Câmpurile statice se inițializează leneș: valoarea se calculează prima dată când sunt folosite. În Dart poți scrie funcții și variabile direct la nivelul fișierului, așa că o clasă plină doar cu membri statici nu este necesară.
Exemple
Exemplul 1: Un contor comun tuturor obiectelor
Fiecare elev nou crește același numarElevi și primește un număr matricol unic.
class Elev {
static int numarElevi = 0;
final String nume;
final int matricol;
Elev(this.nume) : matricol = ++numarElevi;
}
void main() {
final elevi = [Elev('Ana'), Elev('Bogdan'), Elev('Carmen')];
for (final e in elevi) {
print('${e.matricol}. ${e.nume}');
}
print('Total elevi: ${Elev.numarElevi}');
}
Rezultat
1. Ana
2. Bogdan
3. Carmen
Total elevi: 3
Exemplul 2: Constante și metode statice
Tva.cota și Tva.adauga se folosesc fără să creezi vreun obiect.
class Tva {
static const double cota = 0.21;
static double adauga(double pretFaraTva) => pretFaraTva * (1 + cota);
static double extrage(double pretCuTva) => pretCuTva - pretCuTva / (1 + cota);
}
void main() {
print('Cota TVA: ${(Tva.cota * 100).toStringAsFixed(0)}%');
print('100 lei + TVA = ${Tva.adauga(100).toStringAsFixed(2)} lei');
print('TVA din 121 lei = ${Tva.extrage(121).toStringAsFixed(2)} lei');
}
Rezultat
Cota TVA: 21%
100 lei + TVA = 121.00 lei
TVA din 121 lei = 21.00 lei
Exemplul 3: Inițializare leneșă
Câmpul static orase se calculează abia la prima folosire, după primul mesaj.
List<String> incarcaOrase() {
print('Încarc lista de orașe...');
return ['Cluj-Napoca', 'Iași', 'Timișoara'];
}
class Config {
static final List<String> orase = incarcaOrase();
}
void main() {
print('Programul a pornit.');
print(Config.orase.first);
print(Config.orase.length);
}
Rezultat
Programul a pornit.
Încarc lista de orașe...
Cluj-Napoca
3
Greșeli frecvente
- Apelul unei metode statice printr-un obiect (
elev.numarElevi): eroare, se scrieElev.numarElevi. - Folosirea câmpurilor obiectului într-o metodă
static: nu existăthisacolo. - Stare globală ascunsă în câmpuri statice modificabile: face programul greu de testat. Preferă să transmiți datele ca parametri.