Menu
Coddy logo textTech

Nullable e non nullable

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 24 di 110.

Ora che hai capito perché la sicurezza rispetto ai valori null è importante, vediamo come dichiarare variabili che possono contenere null. In Dart, rendi nullable un tipo aggiungendo un ? dopo il nome del tipo.

String name = 'Alice';   // Non nullable - deve sempre avere un valore
String? nickname;        // Nullable - può essere null o una String

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

La differenza fondamentale è che i tipi non nullable garantiscono l'esistenza di un valore, mentre i tipi nullable consentono esplicitamente l'assenza di un valore. Questa distinzione si applica a tutti i tipi:

int count = 10;       // Deve avere un valore
int? optionalCount;   // Può essere null

List<String> items = [];      // Deve essere una lista (può essere vuota)
List<String>? maybeItems;     // Potrebbe essere null (nessuna lista)

Nota che una lista vuota [] è diversa da null. Una lista vuota esiste, ma non contiene nulla; null significa che non esiste alcuna lista.

Il compilatore applica rigorosamente queste regole. Non puoi assegnare null a una variabile non nullable e non puoi usare una variabile nullable dove è prevista una non nullable senza prima verificare che sia null:

String? maybeName = 'Bob';
// String definite = maybeName;  // Errore! Non è possibile assegnare un valore nullable a uno non-nullable

Nella prossima lezione imparerai gli operatori che Dart mette a disposizione per lavorare in sicurezza con i valori nullable.

challenge icon

Sfida

Facile

Creiamo un sistema di lista di film da vedere che dimostra la differenza tra informazioni obbligatorie e facoltative usando tipi nullable e non-nullable.

Creerai due file per organizzare il codice:

  • movie.dart: Definisci una classe Movie che rappresenta un film nella tua lista. Ogni film deve avere un titolo e l'anno di uscita (sono sempre obbligatori), ma alcuni dettagli aggiuntivi potrebbero non essere disponibili per tutti i film. La tua classe dovrebbe avere:
    • Una String title non-nullable: ogni film deve avere un titolo
    • Un int year non-nullable: ogni film deve avere un anno di uscita
    • Una String? director nullable: il regista potrebbe essere sconosciuto
    • Un double? rating nullable: non tutti i film hanno già ricevuto una valutazione
    • Un costruttore che accetta title e year come parametri obbligatori
    • Un metodo displayInfo() che stampa le informazioni sul film, mostrando Unknown se il regista non è disponibile e Not rated se manca la valutazione
  • main.dart: Importa la classe dei film e crea una piccola lista che mostri dati dei film sia completi sia incompleti:
    • Crea un film con il titolo 'Inception' e l'anno 2010, poi imposta il regista su 'Christopher Nolan' e la valutazione su 8.8
    • Crea un film con il titolo 'The Matrix' e l'anno 1999, poi imposta solo la valutazione su 8.7 (lascia il regista impostato su null)
    • Crea un film con il titolo 'Upcoming Film' e l'anno 2025 (lascia sia il regista sia la valutazione impostati su null)
    • Chiama displayInfo() su ciascun film nell'ordine indicato sopra

Il metodo displayInfo() dovrebbe stampare nel seguente formato esatto:

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

Nota che i campi non-nullable (title e year) hanno sempre un valore garantito, mentre i campi nullable (director? e rating?) possono rimanere non impostati. Questo riflette situazioni del mondo reale in cui alcuni dati sono essenziali e altri facoltativi.

Risultato previsto:

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

Provalo tu

import 'movie.dart';

void main() {
  // TODO: Crea un film con titolo 'Inception' e anno 2010
  // Poi imposta director su 'Christopher Nolan' e rating su 8.8
  
  // TODO: Crea un film con titolo 'The Matrix' e anno 1999
  // Poi imposta solo rating su 8.7 (lascia director a null)
  
  // TODO: Crea un film con titolo 'Upcoming Film' e anno 2025
  // Lascia sia director sia rating a null
  
  // TODO: Chiama displayInfo() su ogni film nell'ordine indicato
}
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