Null-aware Operatoren
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 27 von 110.
Über ?. und ! hinaus bietet Dart zusätzliche Operatoren, die das Arbeiten mit Nullable-Werten prägnanter machen. Diese Null-aware-Operatoren helfen Ihnen dabei, saubereren Code zu schreiben, wenn Sie mit potenziellen Null-Werten arbeiten.
Der Null-Coalescing-Operator ?? gibt den linken Wert zurück, wenn dieser nicht null ist, andernfalls gibt er den rechten Wert zurück:
String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName); // Guest
nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName); // AlexDer Null-aware Zuweisungsoperator ??= weist nur dann einen Wert zu, wenn die Variable aktuell null ist:
String? username;
username ??= 'Anonymous';
print(username); // Anonymous
username ??= 'NewName';
print(username); // Immer noch Anonymous (war nicht null)Sie können den Null-aware-Zugriffsoperator ?. für verschachtelte Eigenschaften verketten:
String? city = user?.address?.city; // Sicher, selbst wenn user oder address null istDiese Operatoren lassen sich gut kombinieren. Zum Beispiel könnten Sie auf eine Nullable-Eigenschaft zugreifen und einen Standardwert angeben:
String greeting = user?.name ?? 'Stranger';
// Wenn user null ist ODER user.name null ist, verwende 'Stranger'Die Verwendung dieser Operatoren hält Ihren Code lesbar und gewährleistet gleichzeitig die Null-Sicherheit in Ihrem gesamten Programm.
Aufgabe
EinfachLassen Sie uns ein Gästeregistrierungssystem erstellen, das zeigt, wie Null-Aware-Operatoren Ihren Code sauberer machen können, wenn Sie mit optionalen Informationen arbeiten.
Sie werden Ihren Code in zwei Dateien organisieren:
guest.dart: Definieren Sie eine KlasseGuest, die jemanden darstellt, der an einer Veranstaltung teilnimmt. Einige Gäste geben vollständige Details an, während andere nur die Grundlagen nennen. Ihre Klasse sollte Folgendes enthalten:- Ein nicht-nullbares
String name- jeder Gast muss einen Namen haben - Ein nullbares
String? email- nicht jeder gibt eine E-Mail-Adresse an - Ein nullbares
String? dietaryPreference- einige Gäste geben keine Ernährungswünsche an - Einen Konstruktor, der
nameals erforderlichen Parameter entgegennimmt - Eine Methode
getDisplayEmail(), die die E-Mail zurückgibt, falls verfügbar, oder'No email provided'unter Verwendung des??-Operators - Eine Methode
assignDefaultDiet(), diedietaryPreferencenur dann auf'Standard'setzt, wenn sie aktuell null ist, unter Verwendung des??=-Operators - Eine Methode
getEmailDomain(), die die Länge der E-Mail unter Verwendung von?.zurückgibt, odernull, falls keine E-Mail existiert - Eine Methode
printBadge(), die die Badge-Informationen des Gastes ausgibt
- Ein nicht-nullbares
main.dart: Importieren Sie Ihre Guest-Klasse und registrieren Sie drei Gäste mit unterschiedlichem Informationsumfang:- Erstellen Sie einen Gast namens
'Alice', setzen Sie ihre E-Mail auf'alice@company.com'und die Ernährungspräferenz auf'Vegetarian' - Erstellen Sie einen Gast namens
'Bob', setzen Sie nur seine E-Mail auf'bob@email.org'(lassen Sie die Ernährungspräferenz auf null) - Erstellen Sie einen Gast namens
'Charlie'(lassen Sie sowohl E-Mail als auch Ernährungspräferenz auf null) - Rufen Sie
assignDefaultDiet()für alle drei Gäste auf - Rufen Sie für jeden Gast nacheinander
printBadge()auf und geben Sie dannEmail length: [result]unter Verwendung vongetEmailDomain()aus
- Erstellen Sie einen Gast namens
Die Methode printBadge() sollte in diesem Format drucken:
=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]Beachten Sie, wie Alices Ernährungspräferenz auf 'Vegetarian' bleibt, weil ??= nur zuweist, wenn der Wert null ist, während Bob und Charlie die Standard-Diät 'Standard' zugewiesen bekommen.
Erwartete Ausgabe:
=== 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: nullSpickzettel
Dart bietet Null-aware-Operatoren, um prägnanter mit Nullable-Werten zu arbeiten.
Der Null-Coalescing-Operator ?? gibt den linken Wert zurück, wenn dieser nicht null ist, andernfalls den rechten Wert:
String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName); // Guest
nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName); // AlexDer Null-aware Zuweisungsoperator ??= weist einen Wert nur dann zu, wenn die Variable aktuell null ist:
String? username;
username ??= 'Anonymous';
print(username); // Anonymous
username ??= 'NewName';
print(username); // Still Anonymous (wasn't null)Sie können den Null-aware Zugriffsoperator ?. für verschachtelte Eigenschaften verketten:
String? city = user?.address?.city; // Sicher, selbst wenn user oder address null istDiese Operatoren können miteinander kombiniert werden:
String greeting = user?.name ?? 'Stranger';
// Wenn user null ist ODER user.name null ist, verwende 'Stranger'Probier es selbst
import 'guest.dart';
void main() {
// TODO: Erstelle einen Gast namens 'Alice'
// Setze ihre E-Mail auf 'alice@company.com'
// Setze ihre Ernährungsvorliebe auf 'Vegetarian'
// TODO: Erstelle einen Gast namens 'Bob'
// Setze nur seine E-Mail auf 'bob@email.org'
// Lasse die Ernährungsvorliebe auf null
// TODO: Erstelle einen Gast namens 'Charlie'
// Lasse sowohl E-Mail als auch Ernährungsvorliebe auf null
// TODO: Rufe assignDefaultDiet() für alle drei Gäste auf
// TODO: Für jeden Gast in der Reihenfolge (Alice, Bob, Charlie):
// - Rufe printBadge() auf
// - Drucke 'Email length: [result]' unter Verwendung von getEmailDomain()
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor