Menu
Coddy logo textTech

Campi final e const

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 18 di 110.

Quando dichiari i campi in una classe, puoi usare final o const per controllare se i valori possono cambiare dopo l'inizializzazione. Entrambi creano valori immutabili, ma funzionano in modo diverso.

Un campo final può essere impostato una sola volta, ma il suo valore viene determinato durante l’esecuzione. Puoi assegnarlo nella dichiarazione o tramite un costruttore:

class Person {
  final String name;
  final DateTime createdAt = DateTime.now();
  
  Person(this.name);
}

Person p = Person('Alice');
// p.name = 'Bob';  // Errore: impossibile riassegnare il campo final

name viene impostato quando l'oggetto viene creato, e createdAt registra l'ora corrente. Entrambi i valori sono bloccati dopo l'inizializzazione.

Un campo static const deve avere un valore noto al momento della compilazione. Appartiene alla classe stessa ed è condiviso da tutte le istanze:

class Circle {
  static const double pi = 3.14159;
  final double radius;
  
  Circle(this.radius);
  
  double get area => Circle.pi * radius * radius;
}

La differenza fondamentale: i campi final possono contenere valori calcolati in fase di esecuzione (come DateTime.now()), mentre const richiede costanti definite in fase di compilazione. I campi di istanza non possono essere direttamente const: a livello di classe è consentito solo static const.

challenge icon

Sfida

Facile

Costruiamo un sistema di catalogo prodotti che mostri la differenza tra i campi final e static const. Creerai prodotti con proprietà immutabili e valori di configurazione condivisi.

Organizzerai il codice in due file:

  • product.dart: definisci una classe Product che rappresenta un articolo in un negozio. La classe deve avere:
    • Un static const double taxRate impostato a 0.08 (aliquota fiscale dell'8% condivisa da tutti i prodotti)
    • Un static const String currency impostato a 'USD'
    • Un final String name per il nome del prodotto (impostato tramite il costruttore)
    • Un final double basePrice per il prezzo base del prodotto (impostato tramite il costruttore)
    • Un final String sku (unità di gestione delle scorte) che combina un prefisso con il nome del prodotto, calcolato in una lista di inizializzazione come 'SKU-' seguito dal nome in maiuscolo
    • Un costruttore che accetta name e basePrice
    • Un getter priceWithTax che calcola il prezzo comprensivo di imposte
    • Un metodo display() che stampa le informazioni sul prodotto
  • main.dart: importa la classe del prodotto e crea due prodotti:
    • Un 'Laptop' con prezzo base 999.99
    • Un 'Mouse' con prezzo base 29.99
    Chiama display() su ciascun prodotto nell'ordine indicato sopra.

Il metodo display() deve stampare nel seguente formato esatto:

[sku] - [name]: [basePrice] [currency] (with tax: [priceWithTax] [currency])

Arrotonda priceWithTax a 2 cifre decimali usando toStringAsFixed(2) quando lo visualizzi.

Output previsto:

SKU-LAPTOP - Laptop: 999.99 USD (with tax: 1079.99 USD)
SKU-MOUSE - Mouse: 29.99 USD (with tax: 32.39 USD)

Provalo tu

import 'product.dart';

void main() {
  // TODO: Crea un Product chiamato 'Laptop' con prezzo base 999.99
  
  // TODO: Crea un Product chiamato 'Mouse' con prezzo base 29.99
  
  // TODO: Chiama display() su ciascun prodotto nell'ordine indicato (prima Laptop, poi Mouse)
  
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online