コンストラクタ
プログラミング言語 Dart はもちろん比較的新しい言語であるには違いないのですが、 意外とオーソドックスな伝統的なシンタックスになってます。このため Java などを知っている人にも馴染みやすい言語といえると思います。
ところが、ややクセが強いところもあります。そのひとつがコンストラクタです。
コンストラクタの内部フィールドの初期化方法、引数の省略時の動作、そして名前付きコンストラクタなどは、 よく使われるのでよく理解しておきましょう。
ここではコンストラクタの基本的な書き方使い方について説明します。
コンストラクタの種類
Dart のコンストラクタは二種類に分類されます。
ひとつは Generative コンストラクタ (ジェネレイティブコンストラクタ。「生成的」コンストラクタ)。もうひとつは、 Factory コンストラクタ (ファクトリコンストラクタ) です。
ジェネレイティブ・コンストラクタは、いわば普通のコンストラクタです。それを呼び出すことで、新しいインスタンスを返します。
一方、ファクトリ・コンストラクタは、必ずしも新しいインスタンスを返す必要のないコンストラクタで、factory というキーワードをつけて作ります。 ファクトリコンストラクタの典型的な使い方としては、シングルトンを作成する場合につかいます。
この記事では特に断らなければ、ジェネレイティブ・コンストラクタについて記載します。
コンストラクタ。まずは基本から。
Dart のクラス定義は Java などによく似ています。次のように地味に必要なパラメータを全て渡して、 それぞれのインスタンス変数に代入することで、それらを初期化することができます。
class Person {
String firstName;
String lastName;
int age;
Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
sayHello() {
print('Hi, I\'m $firstName $lastName ($age).');
}
}
void main() {
var p = new Person('Hanako', 'Yamada', 25);
p.sayHello();
}
この実行結果は次の通りです。
Hi, I'm Hanako Yamada (25).
さて、上のコードのように、単純に値をセットするだけのコンストラクタは、次のように単純に記述できます。
class Person {
String firstName;
String lastName;
int age;
Person(this.firstName, this.lastName, this.age);
...
実行結果は全く同様です。Dart ではこの書き方が普通です。
オプショナル引数
上の例で、例えばコンストラクタに age (年齢) を渡しても渡さなくても良いようにできないでしょうか。
コンストラクタへの引数を任意 (オプショナル) にするには、次のようにパラメータに [] をつけます。
[] で囲むのは配列やリスト (コレクション) のようで、一瞬紛らわしい気もしますね。でも、一般にターミナルでのコマンドオプションの説明では、括弧書きでオプションを表したりすることがあることを踏まえれば、 わかりやすいとも言えると思います。
class Person {
String firstName;
String lastName;
int age;
Person(this.firstName, this.lastName, [this.age]);
sayHello() {
print('Hi, I\'m $firstName $lastName ($age).');
}
}
void main() {
var p = new Person('Hanako', 'Yamada');
p.sayHello();
}
ここでは、main() 関数で、Person オブジェクトを作成していますが、 オプショナルにした age には値を渡していないのに注意してください。この実行結果は次の通りです。
Hi, I'm Hanako Yamada (null).
値を渡しておらず、デフォルト値もないので、age が null になっています。
Dart では全ての型がオブジェクトで null になりえますので、数値型でも勝手に 0 になるとか、そういう認識でいると間違いますので注意が必要です。
任意引数のデフォルト値は次のように = で設定できます。
Person(this.firstName, this.lastName, [this.age = 30]);
factory コンストラクタ
factory と指定されたコンストラクタは、シングルトンを作成する時に使用します。
具体例は次のページをみてください。「シングルトンの作成」