Primary Constructors(メインコンストラクタ)

概念を理解する

必要なDart言語最低バージョン:3.13

役割:クラス先頭の1行でフィールド + メインコンストラクタを同時に宣言でき、定型コードを大幅に削減します。実行時の動作は従来のコンストラクタと完全に同一で、文法だけが簡略化されています。

  1. Declaring parameters(宣言型パラメータ):クラス先頭の引数に var / final を付けると、同名のインスタンスフィールドが自動生成されます。
  2. Non-declaring parameters(通常パラメータ):引数に var/final がない場合、単なるコンストラクタの入力引数となり、クラスフィールドは作成されません。
  3. In-body constructors(クラス内部コンストラクタ):クラスの波括弧内に記述する名前付きコンストラクタ・ファクトリコンストラクタ・リダイレクトコンストラクタを指します。
  4. 強制ルール:メインコンストラクタを持つクラスには、リダイレクト以外の生成コンストラクタを別途定義できません。すべてのインスタンスが必ずメインコンストラクタを経由するようにするためです。

従来記法とメインコンストラクタ簡略記法の比較

// 従来の冗長な記法
class Point {
  int x;
  int y;
  Point(this.x, this.y);
}

// メインコンストラクタ簡略記法
class Point(var int x, var int y);Code language: JavaScript (javascript)

フィールド自動生成ルール

1. var / final 付き

インスタンスフィールドが自動作成されます。

クラス名直後の括弧内にフィールド変数を直接記述します。

// x、yがクラスのメンバ変数として自動生成
class Point(var int x, final int y);

void main() {
  final p = Point(10, 20);
  print(p.x); // 10
  print(p.y); // 20
  // p.y = 30; // エラー:yはfinal宣言されているため
}Code language: JavaScript (javascript)

上記コードを実行するとエラーが発生します。

D:\dartdemo\firstdart\bin>dart run
Building package executable...
Failed to build firstdart:firstdart:
firstdart.dart:2:13: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
            ^^^
firstdart.dart:2:12: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
           ^
firstdart.dart:2:36: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);Code language: JavaScript (javascript)

エラー原因:class Point(var int x, final int y); というメインコンストラクタ簡略記法(Primary Constructors)はDartの実験的機能のため、現在の安定版Dartでは標準で無効化されており、そのまま実行すると文法エラーが出ます。

現在は2026年7月10日14時55分であり、読者がこの記事を閲覧するタイミングでDartが正式新バージョンをリリースし、デフォルトでこの文法に対応している可能性もあります。

一時的にテストする場合は下記コマンドを使用します。

dart run --enable-experiment=primary-constructors

2. var / final なし

一時的な引数のみとなり、フィールドは生成されません。

class User(String name) {
  // print(name); // クラス内部から引数に直接アクセス可能だが、this.nameフィールドは作成されない
  final String msg = "Hi $name"; // コンパイルエラー
}

void main() {
  final u = User("Tom");
  // print(u.name); // コンパイルエラー:nameフィールドが存在しない
}Code language: JavaScript (javascript)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です