Null-bewusste 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
EinfachErstellen wir ein Gästeregistrierungssystem, das zeigt, wie null-bewusste Operatoren deinen Code beim Umgang mit optionalen Informationen übersichtlicher machen können.
Du organisierst deinen Code in zwei Dateien:
guest.dart: Definiere eineGuest-Klasse, die eine Person repräsentiert, die an einer Veranstaltung teilnimmt. Einige Gäste geben vollständige Angaben an, während andere nur die grundlegenden Informationen bereitstellen. Deine Klasse sollte Folgendes enthalten:- Ein nicht nullfähiges
String name– jeder Gast muss einen Namen haben - Ein nullfähiges
String? email– nicht jeder gibt eine E-Mail-Adresse an - Ein nullfähiges
String? dietaryPreference– einige Gäste machen keine Angaben zu ihren Ernährungsbedürfnissen - Einen Konstruktor, der
nameals erforderlichen Parameter entgegennimmt - Eine Methode
getDisplayEmail(), die die E-Mail-Adresse zurückgibt, wenn sie verfügbar ist, oder mithilfe des Operators'No email provided'?? - Eine Methode
assignDefaultDiet(), diedietaryPreferencenur dann auf'Standard'setzt, wenn der Wert aktuell null ist, und dabei den Operator??=verwendet - Eine Methode
getEmailDomain(), die mithilfe von?.die Länge der E-Mail-Adresse zurückgibt odernull, wenn keine E-Mail-Adresse vorhanden ist - Eine Methode
printBadge(), die die Ausweisinformationen des Gastes ausgibt
- Ein nicht nullfähiges
main.dart: Importiere deine Gästeklasse und registriere drei Gäste mit unterschiedlich vielen Angaben:- Erstelle einen Gast namens
'Alice', setze ihre E-Mail-Adresse auf'alice@company.com'und ihre Ernährungspräferenz auf'Vegetarian' - Erstelle einen Gast namens
'Bob', setze nur seine E-Mail-Adresse auf'bob@email.org'(lasse die Ernährungspräferenz auf null) - Erstelle einen Gast namens
'Charlie'(lasse sowohl E-Mail-Adresse als auch Ernährungspräferenz auf null) - Rufe bei allen drei Gästen
assignDefaultDiet()auf - Rufe für jeden Gast in der angegebenen Reihenfolge
printBadge()auf und gib anschließend mithilfe vonEmail length: [result]getEmailDomain()aus
- Erstelle einen Gast namens
Die Methode printBadge() sollte dieses Format ausgeben:
=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]Beachte, dass Alices Ernährungspräferenz 'Vegetarian' bleibt, weil ??= nur dann einen Wert zuweist, wenn der aktuelle Wert null ist, während Bob und Charlie die Standardernährung '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: nullProbier 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 Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler