【Flutter/Dart】名前付きコンストラクタ|クラスで複数のコンストラクタを定義

今回は「名前付きコンストラクタ(Named constructor)」を使用して1つのクラスで複数のコンストラクタを定義する方法を紹介します。

Initializer Listが何かについても紹介していきます。

\ 世界最大級のオンライン学習サービス /

目次

名前付きコンストラクタとは?

void main() {
  var point = Point(5, 2);
  print('Point:${point.point()}');

  var origin = Point.origin();
  print('Point.origin:${origin.point()}');
}

class Point {
  double x, y;

  Point(this.x, this.y);

  Point.origin()
      : x = 0,
        y = 0;

  String point() => '(${this.x}, ${this.y})';
}

//結果
//Point:(5.0, 2.0)
//Point.origin:(0.0, 0.0)

名前付きコンストラクタを使えば1つのクラスに複数のコンストラクタを定義できるので、コンストラクタ別に引数の指定、プロパティ値の指定、インスタンス時に実行する処理など指定できます。

名前付きコンストラクタを使用してインスタンス化したオブジェクトでもメインクラス(上記コードの場合はPoint)のプロパティ、メソッドを使用できます。

名前付きコンストラクタの定義

class Point {
  double x, y;

  //通常のコンストラクタ
  Point(this.x, this.y);

  //名前付きコンストラクタ
  Point.origin()
      : x = 0,
        y = 0;
}

名前付きコンストラクタではListView.builderのように「クラス名.コンストラクタ名」と定義します。

名前付きコンストラクタでクラスのプロパティ値を指定するにはInitializer Listを使用します。

Initializer List

...
Point.origin()
    : x = 0,
      y = 0;

Initializer Listではコロン(:)の後にプロパティ値を指定していきます。複数のプロパティ値を指定する場合はカンマ(,)で区切ります。

...
Point.origin()
    : x = 0,
      y = 0 {
  print('Point.originでインスタンス化');
}

オブジェクト生成時に処理を実行したい場合は上記コードのように処理を追加します。

名前付きコンストラクタでクラス生成

var origin = Point.origin();

名前付きコンストラクタでのインスタンス化は通常のクラス同様です。

サンプルコード

void main() {
  var origin = Point.origin();
  print('Point.origin:${origin.point()}');
}

class Point {
  double x, y;

  Point(this.x, this.y);

  Point.origin()
      : x = 0,
        y = 0 {
    print('Point.originでインスタンス化');
  }

  String point() => '(${this.x}, ${this.y})';
}

//結果
//Point.originでインスタンス化
//Point.origin:(0.0, 0.0)

一緒に読みたい

参考

  • URLをコピーしました!
目次