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 finalname 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.
Sfida
FacileCostruiamo 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 classeProductche rappresenta un articolo in un negozio. La classe deve avere:- Un
static const double taxRateimpostato a0.08(aliquota fiscale dell'8% condivisa da tutti i prodotti) - Un
static const String currencyimpostato a'USD' - Un
final String nameper il nome del prodotto (impostato tramite il costruttore) - Un
final double basePriceper 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
nameebasePrice - Un getter
priceWithTaxche calcola il prezzo comprensivo di imposte - Un metodo
display()che stampa le informazioni sul prodotto
- Un
main.dart: importa la classe del prodotto e crea due prodotti:- Un
'Laptop'con prezzo base999.99 - Un
'Mouse'con prezzo base29.99
display()su ciascun prodotto nell'ordine indicato sopra.- Un
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)
}
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
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online