Menu
Coddy logo textTech

Nullable vs Non-Nullable

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

Maintenant que vous comprenez pourquoi la sécurité contre les valeurs nulles (null safety) est importante, voyons comment déclarer des variables qui peuvent contenir null. En Dart, vous rendez un type nullable en ajoutant un ? après le nom du type.

String name = 'Alice';   // Non-nullable - doit toujours avoir une valeur
String? nickname;        // Nullable - peut être null ou une String

print(name);      // Alice
print(nickname);  // null

La différence clé est que les types non-nullables garantissent qu'une valeur existe, tandis que les types nullables permettent explicitement l'absence de valeur. Cette distinction s'applique à tous les types :

int count = 10;       // Doit avoir une valeur
int? optionalCount;   // Peut être nul

List<String> items = [];      // Doit être une liste (peut être vide)
List<String>? maybeItems;     // Pourrait être nul (pas de liste du tout)

Notez qu'une liste vide [] est différente de null. Une liste vide existe mais ne contient rien ; null signifie qu'aucune liste n'existe du tout.

Le compilateur applique ces règles strictement. Vous ne pouvez pas assigner null à une variable non-nullable, et vous ne pouvez pas utiliser une variable nullable là où une variable non-nullable est attendue sans avoir préalablement vérifié la présence de null :

String? maybeName = 'Bob';
// String definite = maybeName;  // Erreur ! Impossible d'assigner une valeur nullable à une valeur non-nullable

Dans la prochaine leçon, vous apprendrez les opérateurs que Dart fournit pour travailler en toute sécurité avec des valeurs nullables.

challenge icon

Défi

Facile

Construisons un système de liste de films à regarder qui démontre la différence entre les informations obligatoires et les informations facultatives à l’aide de types nullable et non-nullable.

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

  • movie.dart : définis une classe Movie qui représente un film dans ta liste de films à regarder. Chaque film doit avoir un titre et une année de sortie (ces informations sont toujours obligatoires), mais certains détails supplémentaires peuvent ne pas être disponibles pour tous les films. Ta classe doit avoir :
    • Un String title non-nullable : chaque film doit avoir un titre
    • Un int year non-nullable : chaque film doit avoir une année de sortie
    • Un String? director nullable : le réalisateur peut être inconnu
    • Un double? rating nullable : tous les films n’ont pas encore été notés
    • Un constructeur qui prend title et year comme paramètres obligatoires
    • Une méthode displayInfo() qui affiche les informations du film, en indiquant Unknown lorsque le réalisateur est manquant et Not rated lorsque la note est manquante
  • main.dart : importe ta classe de film et crée une petite liste de films à regarder illustrant des données de film complètes et incomplètes :
    • Crée un film avec le titre 'Inception' et l’année 2010, puis définis son réalisateur sur 'Christopher Nolan' et sa note sur 8.8
    • Crée un film avec le titre 'The Matrix' et l’année 1999, puis définis uniquement sa note sur 8.7 (laisse le réalisateur à null)
    • Crée un film avec le titre 'Upcoming Film' et l’année 2025 (laisse le réalisateur et la note à null)
    • Appelle displayInfo() sur chaque film dans l’ordre indiqué ci-dessus

La méthode displayInfo() doit afficher exactement au format suivant :

[title] ([year])
Director: [director or "Unknown"]
Rating: [rating or "Not rated"]

Remarque que les champs non-nullable (title et year) ont toujours la garantie d’avoir une valeur, tandis que les champs nullable (director? et rating?) peuvent rester non définis. Cela reflète des situations réelles dans lesquelles certaines données sont essentielles et d’autres facultatives.

Résultat attendu :

Inception (2010)
Director: Christopher Nolan
Rating: 8.8
The Matrix (1999)
Director: Unknown
Rating: 8.7
Upcoming Film (2025)
Director: Unknown
Rating: Not rated

Essayez vous-même

import 'movie.dart';

void main() {
  // TODO: Créer un film avec le titre 'Inception' et l'année 2010
  // Ensuite, définir son réalisateur sur 'Christopher Nolan' et sa note sur 8.8
  
  // TODO: Créer un film avec le titre 'The Matrix' et l'année 1999
  // Ensuite, définir uniquement sa note sur 8.7 (laisser le réalisateur à null)
  
  // TODO: Créer un film avec le titre 'Upcoming Film' et l'année 2025
  // Laisser à la fois le réalisateur et la note à null
  
  // TODO: Appeler displayInfo() sur chaque film dans l'ordre
}
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