final în Dart

Declară o variabilă care primește valoarea o singură dată și nu mai poate fi reatribuită.

Sintaxă
final nume = valoare;
final Tip nume = valoare;
final Tip nume;   // se inițializează o singură dată, mai târziu

Ce face final

O variabilă final primește o valoare exact o dată. După aceea nu mai poți scrie nume = altceva. Valoarea se calculează la rulare, deci poate veni dintr-o funcție, dintr-un fișier sau de la utilizator.

final blochează doar variabila, nu obiectul: o listă final nu poate fi înlocuită cu altă listă, dar îi poți adăuga elemente. Pentru o valoare complet neschimbabilă, cunoscută la compilare, folosește const.

În clase, câmpurile final se setează în constructor și fac obiectul imuabil. Ghidul de stil Dart recomandă final pentru orice variabilă locală care nu se mai schimbă.

Exemple

Exemplul 1: Valoare calculată la rulare

media este calculată din listă și apoi nu se mai schimbă.

void main() {
  final note = [9, 7, 10, 8];
  final media = note.reduce((a, b) => a + b) / note.length;
  print('Media: $media');
  // media = 10; // eroare: 'media' can't be used as a setter because it's final
}

Rezultat

Media: 8.5

Exemplul 2: final nu înseamnă obiect neschimbat

Lista final poate primi elemente noi; doar variabila nu poate fi îndreptată spre altă listă.

void main() {
  final orase = ['Iași', 'Cluj'];
  orase.add('Timișoara');
  print(orase);
  // orase = ['Brașov']; // eroare: orase este final
}

Rezultat

[Iași, Cluj, Timișoara]

Exemplul 3: Câmpuri final într-o clasă

Câmpurile se setează o dată în constructor. Obiectul Produs nu se mai poate modifica după creare.

class Produs {
  final String nume;
  final double pret;
  Produs(this.nume, this.pret);
}

void main() {
  final p = Produs('Caiet', 4.5);
  print('${p.nume}: ${p.pret} lei');
}

Rezultat

Caiet: 4.5 lei

Greșeli frecvente

  • final x; folosit înainte de a primi valoare: The final variable 'x' can't be read because it's potentially unassigned at this point.
  • Să crezi că final List este o listă care nu se poate modifica: pentru asta folosește const [...] sau List.unmodifiable.
  • Câmp final fără valoare și fără constructor care să-l seteze: The final variable 'x' must be initialized.

Comenzi înrudite

  • const: Declară o constantă calculată la compilare; obiectele const sunt complet imuabile și partajate.
  • var: Declară o variabilă care se poate modifica; tipul este dedus automat din valoarea inițială.
  • late: Amână inițializarea unei variabile nenule: valoarea se dă mai târziu sau se calculează la prima folosire.
  • final class: Modificator de clasă (Dart 3): clasa nu poate fi extinsă și nici implementată în afara fișierului ei.