Costruttori costanti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 13 di 110.
Un costruttore costante crea oggetti costanti in fase di compilazione. Quando crei oggetti con gli stessi valori usando un costruttore const, Dart riutilizza la stessa istanza in memoria, migliorando le prestazioni.
Per creare un costruttore costante, aggiungi la parola chiave const prima del nome del costruttore e assicurati che tutte le variabili di istanza siano final:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // trueSia white sia alsoWhite puntano esattamente allo stesso oggetto in memoria, perché sono stati creati con valori identici usando un costruttore costante.
Puoi anche usare costruttori const senza la parola chiave const, creando così istanze normali (non costanti):
var red = Color(255, 0, 0); // Istanza normale
const blue = Color(0, 0, 255); // Istanza costanteI costruttori costanti sono comunemente usati per oggetti di configurazione immutabili, valori predefiniti come colori o dimensioni e in tutti i casi in cui vuoi garantire l’immutabilità degli oggetti ottimizzando l’uso della memoria.
Sfida
FacileCostruiamo un sistema di configurazione per un semplice gioco che usa costruttori costanti per definire impostazioni immutabili e riutilizzabili.
Creerai due file per organizzare il codice:
difficulty.dart: definisci una classeDifficultyche rappresenta le impostazioni di difficoltà del gioco. La classe dovrebbe avere:- Tre campi
final:name(String),enemyCount(int) eplayerLives(int) - Un costruttore costante che inizializza tutti e tre i campi
- Un metodo
display()che stampa le informazioni sulla difficoltà
- Tre campi
main.dart: importa la classe della difficoltà e crea tre preset costanti di difficoltà:easycon nome'Easy',5nemici e5vitemediumcon nome'Medium',10nemici e3vitehardcon nome'Hard',20nemici e1vita
const. Poi chiamadisplay()su ciascuno, nell'ordine indicato sopra. Infine, verifica se due oggetticonst Difficulty('Easy', 5, 5)sono identici usandoidentical()e stampa il risultato.
Il metodo display() dovrebbe stampare nel seguente formato esatto:
[name]: [enemyCount] enemies, [playerLives] livesOutput previsto:
Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
trueProvalo tu
import 'difficulty.dart';
void main() {
// TODO: Crea tre configurazioni predefinite di difficoltà costanti usando la parola chiave const:
// - easy: nome 'Easy', 5 enemies, 5 lives
// - medium: nome 'Medium', 10 enemies, 3 lives
// - hard: nome 'Hard', 20 nemici, 1 vita
// TODO: Chiama display() per ogni difficoltà nell'ordine: easy, medium, hard
// TODO: Verifica se due oggetti const Difficulty('Easy', 5, 5) sono identici
// usando identical() e stampa il risultato
}
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