Konstante Konstruktoren
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 13 von 110.
Ein konstanter Konstruktor erzeugt zur Kompilierzeit konstante Objekte. Wenn Sie Objekte mit denselben Werten unter Verwendung eines const-Konstruktors erstellen, verwendet Dart dieselbe Instanz im Speicher wieder, was die Performance verbessert.
Um einen konstanten Konstruktor zu erstellen, fügen Sie das Schlüsselwort const vor dem Konstruktornamen hinzu und stellen Sie sicher, dass alle Instanzvariablen final sind:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // trueSowohl white als auch alsoWhite zeigen auf genau dasselbe Objekt im Speicher, da sie mit identischen Werten unter Verwendung eines const-Konstruktors erstellt wurden.
Sie können const-Konstruktoren auch ohne das Schlüsselwort const verwenden, wodurch reguläre (nicht-konstante) Instanzen erstellt werden:
var red = Color(255, 0, 0); // Reguläre Instanz
const blue = Color(0, 0, 255); // Konstante InstanzKonstante Konstruktoren werden häufig für unveränderliche Konfigurationsobjekte, vordefinierte Werte wie Farben oder Größen und überall dort verwendet, wo Sie die Unveränderlichkeit von Objekten garantieren und gleichzeitig die Speichernutzung optimieren möchten.
Aufgabe
EinfachLassen Sie uns ein Konfigurationssystem für ein einfaches Spiel erstellen, das konstante Konstruktoren verwendet, um unveränderliche, wiederverwendbare Einstellungen zu definieren.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
difficulty.dart: Definieren Sie eine KlasseDifficulty, die die Schwierigkeitseinstellungen des Spiels repräsentiert. Ihre Klasse sollte Folgendes haben:- Drei
finalFelder:name(String),enemyCount(int) undplayerLives(int) - Einen konstanten Konstruktor, der alle drei Felder initialisiert
- Eine Methode
display(), die die Informationen zur Schwierigkeit ausgibt
- Drei
main.dart: Importieren Sie Ihre Difficulty-Klasse und erstellen Sie drei konstante Schwierigkeits-Voreinstellungen:easymit dem Namen'Easy',5Feinden und5Lebenmediummit dem Namen'Medium',10Feinden und3Lebenhardmit dem Namen'Hard',20Feinden und1Leben
const. Rufen Sie danndisplay()für jede in der oben aufgeführten Reihenfolge auf. Überprüfen Sie schließlich mitidentical(), ob zweiconst Difficulty('Easy', 5, 5)Objekte identisch sind, und geben Sie das Ergebnis aus.
Die Methode display() sollte in genau diesem Format drucken:
[name]: [enemyCount] enemies, [playerLives] livesErwartete Ausgabe:
Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
trueSpickzettel
Ein konstanter Konstruktor erstellt zur Kompilierzeit konstante Objekte. Wenn Objekte mit identischen Werten unter Verwendung eines const-Konstruktors erstellt werden, verwendet Dart dieselbe Instanz im Speicher wieder.
Um einen konstanten Konstruktor zu erstellen, fügen Sie das Schlüsselwort const vor dem Konstruktornamen hinzu und stellen Sie sicher, dass alle Instanzvariablen final sind:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}Das Erstellen konstanter Instanzen mit identischen Werten führt zum selben Objekt im Speicher:
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // trueConst-Konstruktoren können auch ohne das Schlüsselwort const verwendet werden, um reguläre Instanzen zu erstellen:
var red = Color(255, 0, 0); // Reguläre Instanz
const blue = Color(0, 0, 255); // Konstante InstanzKonstante Konstruktoren sind nützlich für unveränderliche Konfigurationsobjekte, vordefinierte Werte und die Optimierung der Speichernutzung.
Probier es selbst
import 'difficulty.dart';
void main() {
// TODO: Erstelle drei konstante Schwierigkeitsvoreinstellungen unter Verwendung des const-Keywords:
// - easy: Name 'Easy', 5 Gegner, 5 Leben
// - medium: Name 'Medium', 10 Gegner, 3 Leben
// - hard: Name 'Hard', 20 Gegner, 1 Leben
// TODO: Rufe display() für jede Schwierigkeitsstufe in der Reihenfolge easy, medium, hard auf
// TODO: Überprüfe, ob zwei const Difficulty('Easy', 5, 5) Objekte identisch sind
// unter Verwendung von identical() und gib das Ergebnis aus
}
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