Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Creiamo 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 classe Database che simuli una connessione al database. La classe deve avere:
    • Una late String connectionString che verrà impostata dopo la creazione dell'oggetto
    • Una late String status con un inizializzatore pigro che stampa Checking connection... e restituisce 'Connected'
    • Un metodo connect(String connStr) che imposta connectionString e stampa Connection configured: [connectionString]
    • Un metodo query(String sql) che stampa Executing on [connectionString]: [sql]
    • Un metodo checkStatus() che stampa Status: [status] (questo attiverà l'inizializzazione pigra alla prima chiamata)
  • main.dart: importa la classe del database e mostra entrambi gli usi di late:
    • 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

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: Connected

Provalo 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
}
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