Operatori null-aware
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 27 di 110.
Oltre a ?. e !, Dart fornisce operatori aggiuntivi che rendono più conciso il lavoro con valori nullable. Questi operatori che gestiscono i valori null ti aiutano a scrivere codice più pulito quando hai a che fare con possibili valori null.
L'operatore di coalescenza null ?? restituisce il valore a sinistra se non è null, altrimenti restituisce quello a destra:
String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName); // Guest
nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName); // AlexL'operatore di assegnazione con consapevolezza dei valori null ??= assegna un valore solo se la variabile è attualmente null:
String? username;
username ??= 'Anonymous';
print(username); // Anonymous
username ??= 'NewName';
print(username); // Still Anonymous (wasn't null)Puoi concatenare l'operatore di accesso null-aware ?. per le proprietà annidate:
String? city = user?.address?.city; // Sicuro anche se user o address è nullQuesti operatori si combinano bene tra loro. Per esempio, potresti accedere a una proprietà nullable e fornire un valore predefinito:
String greeting = user?.name ?? 'Stranger';
// Se user è null OPPURE user.name è null, usa 'Stranger'L'uso di questi operatori mantiene il codice leggibile garantendo la sicurezza rispetto ai valori null in tutto il programma.
Sfida
FacileCostruiamo un sistema di registrazione degli ospiti che mostri come gli operatori consapevoli di null possano rendere il codice più pulito quando gestisci informazioni facoltative.
Organizzerai il codice in due file:
guest.dart: definisci una classeGuestche rappresenti qualcuno che partecipa a un evento. Alcuni ospiti forniscono tutti i dettagli, mentre altri danno solo le informazioni essenziali. La tua classe dovrebbe avere:- Un
String namenon nullable: ogni ospite deve avere un nome - Un
String? emailnullable: non tutti forniscono un indirizzo email - Un
String? dietaryPreferencenullable: alcuni ospiti non specificano esigenze alimentari - Un costruttore che accetta
namecome parametro obbligatorio - Un metodo
getDisplayEmail()che restituisce l'email se disponibile, oppure'No email provided'usando l'operatore?? - Un metodo
assignDefaultDiet()che impostadietaryPreferencesu'Standard'solo se al momento è null, usando l'operatore??= - Un metodo
getEmailDomain()che restituisce la lunghezza dell'email usando?., oppurenullse non esiste un'email - Un metodo
printBadge()che stampa le informazioni sul badge dell'ospite
- Un
main.dart: importa la tua classe guest e registra tre ospiti con diversi livelli di informazioni:- Crea un ospite di nome
'Alice', imposta la sua email su'alice@company.com'e la preferenza alimentare su'Vegetarian' - Crea un ospite di nome
'Bob', imposta solo la sua email su'bob@email.org'(lascia la preferenza alimentare null) - Crea un ospite di nome
'Charlie'(lascia sia l'email sia la preferenza alimentare null) - Chiama
assignDefaultDiet()per tutti e tre gli ospiti - Per ogni ospite, nell'ordine, chiama
printBadge(), poi stampaEmail length: [result]usandogetEmailDomain()
- Crea un ospite di nome
Il metodo printBadge() dovrebbe stampare in questo formato:
=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]Nota che la preferenza alimentare di Alice resta 'Vegetarian' perché ??= assegna un valore solo quando il valore è null, mentre a Bob e Charlie viene assegnata la dieta predefinita 'Standard'.
Output previsto:
=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: nullProvalo tu
import 'guest.dart';
void main() {
// TODO: Crea un ospite di nome 'Alice'
// Imposta la sua email su 'alice@company.com'
// Imposta la sua preferenza alimentare su 'Vegetarian'
// TODO: Crea un ospite di nome 'Bob'
// Imposta solo la sua email su 'bob@email.org'
// Lascia la preferenza alimentare a null
// TODO: Crea un ospite di nome 'Charlie'
// Lascia sia l'email sia la preferenza alimentare a null
// TODO: Chiama assignDefaultDiet() per tutti e tre gli ospiti
// TODO: Per ogni ospite, nell'ordine (Alice, Bob, Charlie):
// - Chiama printBadge()
// - Stampa 'Email length: [result]' usando getEmailDomain()
}
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