Dartのコンストラクタ

Dartにおけるコンストラクタの最も原始的な構文は以下のように書けます。コンストラクタの引数としてString型のパラメータnameを受け取り、コンストラクタの本体の中でメンバ変数に代入しています。

class Dog {
  String name;

  Dog(String name) {
    this.name = name;
  }
}

以下の構文では、コンストラクタの引数として受け取ったパラメータを直接メンバ変数に代入しています。この構文では、メンバ変数をfinalにすることができます。

class Dog {
  final String name;

  Dog(this.name);
}

上記の構文を用いた場合にも、コンストラクタ本体を定義することができます。

class Dog {
  final String name;

  Dog(this.name) {
    print(name);
  }
}

Dog dog = Dog('pochi'); // => pochi

また、this.nameの部分を{}で囲うと、コンストラクタ呼び出しを名前付き引数で行うことができます。

class Dog {
  final String name;

  Dog({this.name});
}

Dog dog = Dog(name: 'pochi');

Dartでは、コンストラクタのオーバーロードができません。その代わりに、Dartでは名前付きコンストラクタを定義することができます。

class Dog {
  String name;

  Dog(String name) {
    this.name = name;
  }

  Dog.noName() {
    name = 'no name';
  }
}

Dog noName = Dog.noName();
print(noName.name); // => no name

なお、上記の例において、プライマリコンストラクタではthisを用いてメンバ変数にアクセスし、名前付きコンストラクタではthisを用いずにメンバ変数にアクセスしている理由は、前者では名前の隠蔽が発生し、後者では発生しないためです。

筆者

茨城県つくば市在住のソフトウェアエンジニアです。得意領域はAndroidとFlutterです。「Jetpack ComposeによるAndroid MVVMアーキテクチャ入門」の著者です。

👉もっと詳しく