Start Debugging

Dart 3.12 が実験フラグの背後でプライマリコンストラクターを導入

Dart 3.12 は、フィールドとコンストラクターをクラスのヘッダーで宣言する実験的なプライマリコンストラクター構文を追加し、従来の3行のデータクラスを1行に縮めます。

Dart 3.12(2026-05-20 リリース)は、言語の中でも特に要望の多かった機能の1つを実験的なプレビューとして導入しました。プライマリコンストラクターです。単純なデータクラスのために、同じフィールドと this.field というコンストラクターパラメーター、さらに代入を3回書いた経験があるなら、これはそのパターンをなくす構文です。今のところ --enable-experiment=primary-constructors の背後にありますが、日常的な Dart コードの多くの読み方を変えるため、今日のうちにブランチへ組み込んでみる価値があります。

これは Dart 3.12 のもう1つのボイラープレート削減である、初期化フォーマルとしての非公開の名前付きパラメーターに続くものです。プライマリコンストラクターはさらに踏み込み、宣言全体をクラスのヘッダーへ移します。

4行ではなく1行

これは誰もが書くデータクラスであり、本来コンパイラーが最初から生成すべきだった部分です。

class Point {
  final int x;
  final int y;
  Point(this.x, this.y);
}

プライマリコンストラクターを使うと、フィールド宣言とコンストラクターはヘッダーへとまとめられます。空のクラス本体はセミコロンになります。

class Point(final int x, final int y);

ルールはシンプルです。ヘッダーで final または var を付けたパラメーターはインスタンスフィールドになります。修飾子を外すと、フィールドではなく通常のコンストラクターパラメーターのままです。したがって class User(String name);name を保持せずに引数として受け取り、class User(final String name); はそれを保持します。

フィールドはヘッダーのパラメーターに依存できます

ヘッダーのパラメーターはクラス本体のスコープ内にあるため、初期化リストなしでそれらから他の非 late フィールドを初期化できます。

class DeltaPoint(final int x, int delta) {
  final int y = x + delta;
}

ここで delta はコンストラクターパラメーター(final がないためフィールドではありません)で、y はそれから計算されます。

本体で検証を追加する

assert やセットアップが必要な場合は、this で導入されるコンストラクター本体を書きます。初期化リストのみの形式はセミコロンで終わります。

class Point(var int x, var int y) {
  this : assert(x >= 0 && y >= 0) {
    print('Point initialized at ($x, $y)');
  }
}

名前付きコンストラクターも、本体で new を使うより簡潔な形式を得ます。

class Pet {
  String name;

  new() : name = 'Fluffy';
  new withName(this.name);
}

有効にする方法

この機能は実験的なので、実行ごとに有効にします。

dart run --enable-experiment=primary-constructors bin/main.dart

実験的であるため、プレビューとして扱ってください。構文は安定する前にまだ変わる可能性があり、finalvar はパラメーターリスト内で特別な意味を持つようになったので、共有の本番コードにはまだ取り込まないでください。ただしサイドブランチでは、プライマリコンストラクターによって Flutter のウィジェットモデル、値オブジェクト、設定ホルダーが大幅に短くなります。super パラメーターや名前付きコンストラクターのルールを含む完全な仕様は、Dart のプライマリコンストラクターのドキュメントにあります。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る