Dart 3.12 bringt primäre Konstruktoren hinter einem Experiment-Flag
Dart 3.12 fügt eine experimentelle Syntax für primäre Konstruktoren hinzu, die Felder und einen Konstruktor im Klassenkopf deklariert und die klassische dreizeilige Datenklasse auf eine Zeile reduziert.
Dart 3.12 (veröffentlicht am 2026-05-20) brachte eine der meistgewünschten Funktionen der Sprache als experimentelle Vorschau: primäre Konstruktoren. Wenn Sie jemals dasselbe Feld, dazu den Konstruktorparameter this.field und dann die Zuweisung dreimal für eine einfache Datenklasse geschrieben haben, ist dies die Syntax, die dieses Muster beseitigt. Vorerst liegt sie hinter --enable-experiment=primary-constructors, aber es lohnt sich, sie heute in einem Branch einzubinden, weil sie verändert, wie sich ein großer Teil des alltäglichen Dart-Codes liest.
Das knüpft an die andere Reduzierung von Boilerplate in Dart 3.12 an, die privaten benannten Parameter als initialisierende Formale. Primäre Konstruktoren gehen weiter: Sie verschieben die gesamte Deklaration in den Klassenkopf.
Eine Zeile statt vier
Das ist die Datenklasse, die jeder schreibt, der Teil, den der Compiler von Anfang an hätte generieren sollen:
class Point {
final int x;
final int y;
Point(this.x, this.y);
}
Mit einem primären Konstruktor klappen die Felddeklarationen und der Konstruktor in den Kopf zusammen. Ein leerer Klassenrumpf wird zu einem Semikolon:
class Point(final int x, final int y);
Die Regel ist einfach: Ein im Kopf mit final oder var markierter Parameter wird zu einem Instanzfeld. Lassen Sie den Modifizierer weg, bleibt er ein gewöhnlicher Konstruktorparameter und kein Feld. So nimmt class User(String name); den Wert name als Argument an, ohne ihn zu speichern, während class User(final String name); ihn speichert.
Felder können von den Kopfparametern abhängen
Die Kopfparameter sind im Klassenrumpf im Gültigkeitsbereich, sodass Sie andere nicht-late-Felder aus ihnen ohne Initialisierungsliste initialisieren können:
class DeltaPoint(final int x, int delta) {
final int y = x + delta;
}
Hier ist delta ein Konstruktorparameter (ohne final, also kein Feld) und y wird daraus berechnet.
Validierung mit einem Rumpf hinzufügen
Wenn Sie ein assert oder etwas Setup benötigen, schreiben Sie einen Konstruktorrumpf, der mit this eingeleitet wird. Die Form mit reiner Initialisierungsliste endet mit einem Semikolon:
class Point(var int x, var int y) {
this : assert(x >= 0 && y >= 0) {
print('Point initialized at ($x, $y)');
}
}
Auch benannte Konstruktoren erhalten eine kompaktere Form, die new im Rumpf verwendet:
class Pet {
String name;
new() : name = 'Fluffy';
new withName(this.name);
}
So aktivieren Sie es
Die Funktion ist experimentell, daher aktivieren Sie sie pro Ausführung:
dart run --enable-experiment=primary-constructors bin/main.dart
Da sie experimentell ist, behandeln Sie sie als Vorschau: Die Syntax kann sich vor der Stabilisierung noch ändern, und final und var haben jetzt eine besondere Bedeutung in einer Parameterliste, bringen Sie sie also noch nicht in gemeinsam genutzten Produktionscode ein. Aber für einen Nebenbranch machen primäre Konstruktoren Flutter-Widget-Modelle, Wertobjekte und Konfigurationscontainer deutlich kürzer. Die vollständige Spezifikation, einschließlich der super-Parameter und der Regeln für benannte Konstruktoren, finden Sie in der Dokumentation zu primären Konstruktoren von Dart.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.