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 Listeste o listă care nu se poate modifica: pentru asta foloseșteconst [...]sauList.unmodifiable. - Câmp
finalfă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.