static în Dart

Membri care aparțin clasei, nu fiecărui obiect: se folosesc prin numele clasei, ca Nume.camp.

Sintaxă
class Nume {
  static Tip camp = valoare;
  static const Tip CONSTANTA = valoare;
  static Tip metoda() { ... }
}

Nume.camp;
Nume.metoda();

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 scrie Elev.numarElevi.
  • Folosirea câmpurilor obiectului într-o metodă static: nu există this acolo.
  • Stare globală ascunsă în câmpuri statice modificabile: face programul greu de testat. Preferă să transmiți datele ca parametri.

Comenzi înrudite

  • class: Definește un tip nou de obiect, cu câmpuri (date) și metode (comportament).
  • const: Declară o constantă calculată la compilare; obiectele const sunt complet imuabile și partajate.
  • factory: Constructor care nu creează neapărat un obiect nou: poate întoarce unul din cache sau o subclasă.