今回は、Flutterの開発言語「Dart」におけるコンストラクタについて解説をしていきます。
Dartのコンストラクタは大きく2種類に分類することが出来ます。
それぞれの記述方法や特徴を解説していきますのでぜひ最後までご覧ください。
コンストラクタとは?
まず初めに、「そもそもコンストラクタとは何なのか?」ということについて簡単にお伝えしておきます。
コンストラクタとは、クラスがインスタンス化された時に実行される処理のことを言います。
クラスやインスタンスについてはここでは深く触れませんが、実際のコンストラクタの記述方法を見ると、どういった処理が行われているのかを理解していただけるかと思います。
コンストラクタの種類
冒頭でもお伝えした通り、Dartでのコンストラクタは大きく2種類あります。
- Generativeコンストラクタ(生成的コンストラクタ)
- Factoryコンストラクタ(ファクトリコンストラクタ)
それぞれの書き方や違いを順に解説していきます。
Generativeコンストラクタ(生成的コンストラクタ)
Generativeコンストラクタは、一番普通のコンストラクタです。
こちらを実行することで新しいインスタンスを取得できます。
Generativeコンストラクタには3つのコンストラクタがあります。
- 通常のコンストラクタ
- 名前付きコンストラクタ
- リダイレクトコンストラクタ
通常のコンストラクタ
まずは、一番基礎となるコンストラクタの記述を確認していきましょう。
今回は、Personという人を形作るクラスをもとに解説していきます。
class Person {
String? name;
int? age;
Person(String name, int age) { //ここから
this.name = name;
this.age = age;
} //ここまでがコンストラクタ
}
void main() {
Person _personInstance = Person('pRyogram', 25);
print('${_personInstance.name}は${_personInstance.age}歳です');
}
こちらの実行結果は以下です。
pRyogramは25歳です
上記のコードのように単純に値を設定するだけのコンストラクタであれば、次のように記述することができます。(Dartではこちらの書き方が主流。)
class Person {
String? name;
int? age;
Person(this.name, this.age); //この行がコンストラクタ
}
void main() {
Person _personInstance = Person('pRyogram', 25);
print('${_personInstance.name}は${_personInstance.age}歳です');
}
実行結果は全く同じです。
名前付きコンストラクタ
名前付きコンストラクタはインスタンスを用途ごとに分けて生成することができるコンストラクタです。
class Person {
String? name;
int? age;
String? sex;
Person.men(String name, int age) {
this.name = name;
this.age = age;
this.sex = '男性';
}
}
void main() {
Person _personInstance = Person.men('pRyogram', 25);
print('${_personInstance.name}は${_personInstance.age}歳${_personInstance.sex}です');
}
実行結果
pRyogramは25歳男性です
今回は.menという名前付きコンストラクタをPersonクラスに定義しました。
こちらを用いることで男性のPersonを作り出すということをわかりやすく示すことができます。
リダイレクトコンストラクタ
リダイレクトコンストラクタを用いれば、一部の処理を別のコンストラクタに譲渡することができます。
Person.menという名前付きコンストラクタを実行した後に通常のコンストラクタを実行するというリダイレクトコンストラクタを定義していきます。
class Person {
String? name;
int? age;
String? sex;
Person(this.name, this.age, this.sex);
Person.men(String name, int age) : this(name, age, '男性'); //リダイレクトコンストラクタ
}
void main() {
Person _personInstance = Person.men('pRyogram', 25);
print('${_personInstance.name}は${_personInstance.age}歳${_personInstance.sex}です');
}
実行結果
pRyogramは25歳男性です
Factoryコンストラクタ(ファクトリコンストラクタ)
ファクトリコンストラクタはシングルトンパターンの実装に使用されます。
ファクトリコンストラクタを使用すれば新しいインスタンスを生成せずに、予め生成しておいたインスタンスを返すような実装をすることができます。
class Person {
static Person? _personInstance;
String? name;
int? age;
Person._(this.name, this.age);
factory Person(String name, int age) {
if(_personInstance == null) {
_personInstance = Person._(name, age);
}
return _personInstance!;
}
}
void main() {
Person _personInstance1 = Person('pRyogram', 25);
Person _personInstance2 = Person('a', 20);
print('${_personInstance1.name}は${_personInstance1.age}歳です');
print('${_personInstance2.name}は${_personInstance2.age}歳です');
}
実行結果は以下です。
pRyogramは25歳です
pRyogramは25歳です
_personInstance2は一見新しいインスタンスを作成しているのでprintの結果が「aは20歳です」 になるように思いますが、factoryコンストラクタの影響で予め作成したインスタンス(今回の場合は_personInstance1の内容)を返すように設計されています。
そのためファクトリコンストラクタは、自分のアカウント情報のようなアプリ内で一つのインスタンスを使いまわしたいシングルトンパターンの設計に用いられます。
おわりに
今回は、Flutterの開発言語「Dart」におけるコンストラクタについて解説をさせていただきました。
Dartのコンストラクタは大きく2種類、「Generativeコンストラクタ(生成的コンストラクタ)」と「Factoryコンストラクタ(ファクトリコンストラクタ)」があります。
Generativeコンストラクタは新しいインスタンスを生成する時に使用し、Factoryコンストラクタは一度生成したインスタンスを使い回したい時に使用するコンストラクタです。
ぜひこれらの知識をご自身の開発に役立ててもらえればと思います。
最後まで読んでくださりありがとうございました。
コメント