Late-Variablen
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 19 von 110.
Das Schlüsselwort late teilt Dart mit, dass eine nicht-nullbare Variable initialisiert wird, bevor sie verwendet wird, auch wenn sie nicht sofort zugewiesen wird. Dies ist nützlich, wenn Sie ein Feld nicht in der Deklaration oder im Konstruktor initialisieren können, Sie aber sicher sind, dass es einen Wert haben wird, bevor darauf zugegriffen wird.
class User {
late String username;
void initialize(String name) {
username = name;
}
void greet() {
print('Hello, $username!');
}
}
User user = User();
user.initialize('Alice');
user.greet(); // Hallo, Alice!Ohne late würde Dart bemängeln, dass username nicht initialisiert ist. Der late-Modifikator verspricht, dass Sie einen Wert zuweisen, bevor Sie ihn lesen.
Ein weiterer Vorteil von late ist die verzögerte Initialisierung. Eine late-Variable mit einem Initialisierer berechnet ihren Wert erst, wenn auf sie zugegriffen wird:
class Config {
late String settings = loadSettings();
String loadSettings() {
print('Loading...');
return 'default';
}
}
Config config = Config();
print('Config created');
print(config.settings); // "Loading..." wird hier ausgegeben, dann "default"Die loadSettings()-Methode wird erst ausgeführt, wenn auf settings zum ersten Mal zugegriffen wird, nicht wenn das Objekt erstellt wird. Seien Sie jedoch vorsichtig – der Zugriff auf eine late-Variable, bevor sie initialisiert wurde, löst einen Laufzeitfehler aus.
Aufgabe
EinfachErstellen wir einen Datenbankverbindungsmanager, der sowohl verzögerte Initialisierung als auch Lazy-Initialisierung mithilfe von late-Variablen demonstriert.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
database.dart: Definiere eineDatabase-Klasse, die eine Datenbankverbindung simuliert. Deine Klasse sollte Folgendes enthalten:- Eine
late String connectionString, die gesetzt wird, nachdem das Objekt erstellt wurde - Eine
late String statusmit einem Lazy-Initialisierer, derChecking connection...ausgibt und'Connected'zurückgibt - Eine
connect(String connStr)-Methode, dieconnectionStringsetzt undConnection configured: [connectionString]ausgibt - Eine
query(String sql)-Methode, dieExecuting on [connectionString]: [sql]ausgibt - Eine
checkStatus()-Methode, dieStatus: [status]ausgibt (dadurch wird die Lazy-Initialisierung beim ersten Aufruf ausgelöst)
- Eine
main.dart: Importiere deine Datenbankklasse und demonstriere beide Verwendungsweisen vonlate:- Erstelle eine
Database-Instanz - Gib
Database object createdaus - Rufe
connect()mit dem Verbindungsstring'localhost:5432/mydb'auf - Rufe
query()mit'SELECT * FROM users'auf - Rufe
checkStatus()auf, um die Lazy-Initialisierung auszulösen
- Erstelle eine
Beachte, wie connectionString nach der Objekterstellung manuell gesetzt wird, während status seinen Wert erst berechnet, wenn erstmals darauf zugegriffen wird.
Erwartete Ausgabe:
Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: ConnectedProbier es selbst
import 'database.dart';
void main() {
// TODO: Erstelle eine Database-Instanz
// TODO: Gib 'Database object created' aus
// TODO: Rufe connect() mit 'localhost:5432/mydb' auf
// TODO: Rufe query() mit 'SELECT * FROM users' auf
// TODO: Rufe checkStatus() auf, um die verzögerte Initialisierung auszulösen
}
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