Menu
Coddy logo textTech

Variables différées

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 19 sur 110.

Le mot-clé late indique à Dart qu'une variable non-nullable sera initialisée avant d'être utilisée, même si elle n'est pas assignée immédiatement. C'est utile lorsque vous ne pouvez pas initialiser un champ dans la déclaration ou le constructeur, mais que vous êtes certain qu'il aura une valeur avant d'être accédé.

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
  
  void greet() {
    print('Hello, $username!');
  }
}

User user = User();
user.initialize('Alice');
user.greet();  // Hello, Alice!

Sans late, Dart se plaindrait que username n'est pas initialisé. Le modificateur late promet que vous assignerez une valeur avant de la lire.

Un autre avantage de late est l'initialisation paresseuse. Une variable late avec un initialiseur ne calculera sa valeur qu'au moment de son premier accès :

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();
print('Config created');
print(config.settings);  // "Loading..." s'affiche ici, puis "default"

La méthode loadSettings() s'exécute uniquement lorsque settings est accédé pour la première fois, et non lors de la création de l'objet. Attention cependant : accéder à une variable late avant qu'elle ne soit initialisée génère une erreur d'exécution.

challenge icon

Défi

Facile

Construisons un gestionnaire de connexions à une base de données qui illustre à la fois l’initialisation différée et l’initialisation paresseuse à l’aide de variables late.

Tu vas créer deux fichiers pour organiser ton code :

  • database.dart : définis une classe Database qui simule une connexion à une base de données. Ta classe doit avoir :
    • Un late String connectionString qui sera défini après la création de l’objet
    • Un late String status avec un initialiseur paresseux qui affiche Checking connection... et renvoie 'Connected'
    • Une méthode connect(String connStr) qui définit connectionString et affiche Connection configured: [connectionString]
    • Une méthode query(String sql) qui affiche Executing on [connectionString]: [sql]
    • Une méthode checkStatus() qui affiche Status: [status] (cela déclenchera l’initialisation paresseuse lors du premier appel)
  • main.dart : importe ta classe de base de données et montre les deux utilisations de late :
    • Créer une instance de Database
    • Afficher Database object created
    • Appeler connect() avec la chaîne de connexion 'localhost:5432/mydb'
    • Appeler query() avec 'SELECT * FROM users'
    • Appeler checkStatus() pour déclencher l’initialisation paresseuse

Remarque que connectionString est défini manuellement après la création de l’objet, tandis que status ne calcule sa valeur que lors de son premier accès.

Sortie attendue :

Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: Connected

Essayez vous-même

import 'database.dart';

void main() {
  // TODO : Créer une instance de Database
  
  // TODO : Afficher 'Database object created'
  
  // TODO : Appeler connect() avec 'localhost:5432/mydb'
  
  // TODO : Appeler query() avec 'SELECT * FROM users'
  
  // TODO : Appeler checkStatus() pour déclencher l'initialisation paresseuse
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Dart en ligne