Variabili late
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 19 di 110.
La parola chiave late indica a Dart che una variabile non nullable verrà inizializzata prima di essere utilizzata, anche se non le viene assegnato subito un valore. È utile quando non puoi inizializzare un campo nella dichiarazione o nel costruttore, ma sei certo che avrà un valore prima di accedervi.
class User {
late String username;
void initialize(String name) {
username = name;
}
void greet() {
print('Hello, $username!');
}
}
User user = User();
user.initialize('Alice');
user.greet(); // Ciao, Alice!Senza late, Dart si lamenterebbe perché username non è inizializzato. Il modificatore late garantisce che assegnerai un valore prima di leggerlo.
Un altro vantaggio di late è l'inizializzazione differita. Una variabile late con un inizializzatore non calcolerà il proprio valore finché non verrà utilizzata per la prima volta:
class Config {
late String settings = loadSettings();
String loadSettings() {
print('Loading...');
return 'default';
}
}
Config config = Config();
print('Config created');
print(config.settings); // "Loading..." viene stampato qui, poi "default"Il metodo loadSettings() viene eseguito solo quando si accede per la prima volta a settings, non quando viene creato l'oggetto. Fai però attenzione: accedere a una variabile late prima che venga inizializzata genera un errore di runtime.
Sfida
FacileCreiamo un gestore di connessioni al database che mostri sia l'inizializzazione differita sia l'inizializzazione pigra usando variabili late.
Creerai due file per organizzare il codice:
database.dart: definisci una classeDatabaseche simuli una connessione al database. La classe deve avere:- Una
late String connectionStringche verrà impostata dopo la creazione dell'oggetto - Una
late String statuscon un inizializzatore pigro che stampaChecking connection...e restituisce'Connected' - Un metodo
connect(String connStr)che impostaconnectionStringe stampaConnection configured: [connectionString] - Un metodo
query(String sql)che stampaExecuting on [connectionString]: [sql] - Un metodo
checkStatus()che stampaStatus: [status](questo attiverà l'inizializzazione pigra alla prima chiamata)
- Una
main.dart: importa la classe del database e mostra entrambi gli usi dilate:- Crea un'istanza di
Database - Stampa
Database object created - Chiama
connect()con la stringa di connessione'localhost:5432/mydb' - Chiama
query()con'SELECT * FROM users' - Chiama
checkStatus()per attivare l'inizializzazione pigra
- Crea un'istanza di
Nota come connectionString venga impostata manualmente dopo la creazione dell'oggetto, mentre status calcola il proprio valore solo al primo accesso.
Output previsto:
Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: ConnectedProvalo tu
import 'database.dart';
void main() {
// TODO: Crea un'istanza di Database
// TODO: Stampa 'Database object created'
// TODO: Chiama connect() con 'localhost:5432/mydb'
// TODO: Chiama query() con 'SELECT * FROM users'
// TODO: Chiama checkStatus() per attivare l'inizializzazione differita
}
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