const în Dart

Declară o constantă calculată la compilare; obiectele const sunt complet imuabile și partajate.

Sintaxă
const nume = valoare;            // constantă de compilare
const [1, 2, 3]                  // listă constantă
const Clasa(...)                 // obiect constant
static const nume = valoare;     // în clasă

Ce face const

const înseamnă că valoarea este cunoscută încă de la compilare: literali (3, 'Iași'), alte constante și operații simple între ele. Nu poți folosi rezultatul unei funcții obișnuite sau DateTime.now().

Spre deosebire de final, const face și obiectul imuabil: o listă const nu acceptă add. Două expresii const cu aceeași valoare sunt chiar același obiect în memorie, ceea ce economisește memorie (în Flutter se folosește des la widget-uri).

Clasele pot avea constructori const dacă toate câmpurile sunt final. În clase, constantele se declară static const.

Exemple

Exemplul 1: Constante simple

Constantele pot fi calculate din alte constante.

const tva = 0.19;
const pretFaraTva = 100;
const pretCuTva = pretFaraTva * (1 + tva);

void main() {
  print('Preț cu TVA: $pretCuTva lei');
}

Rezultat

Preț cu TVA: 119.0 lei

Exemplul 2: Listă const: nu se poate modifica

Adăugarea într-o listă const aruncă UnsupportedError la rulare.

void main() {
  const zile = ['luni', 'marți', 'miercuri'];
  print(zile);
  try {
    zile.add('joi');
  } on UnsupportedError catch (e) {
    print('Nu merge: ${e.message}');
  }
}

Rezultat

[luni, marți, miercuri]
Nu merge: Cannot add to an unmodifiable list

Exemplul 3: Obiecte const identice

Două obiecte const cu aceleași valori sunt același obiect: identical dă true. Cu new obișnuit ar fi două obiecte diferite.

class Punct {
  final int x, y;
  const Punct(this.x, this.y);
}

void main() {
  const a = Punct(1, 2);
  const b = Punct(1, 2);
  final c = Punct(1, 2);
  print(identical(a, b));
  print(identical(a, c));
}

Rezultat

true
false

Greșeli frecvente

  • const acum = DateTime.now();: Const variables must be initialized with a constant value. Folosește final.
  • Constructor const într-o clasă cu un câmp care nu este final: Can't define a const constructor for a class with non-final fields.
  • Confuzia între final (o singură atribuire, valoare la rulare) și const (valoare la compilare, obiect imuabil).

Comenzi înrudite

  • final: Declară o variabilă care primește valoarea o singură dată și nu mai poate fi reatribuită.
  • var: Declară o variabilă care se poate modifica; tipul este dedus automat din valoarea inițială.
  • constructori: Funcțiile speciale care creează și inițializează obiectele unei clase.
  • static: Membri care aparțin clasei, nu fiecărui obiect: se folosesc prin numele clasei, ca Nume.camp.