【Flutter】Dartのコンストラクタ(Constructors)の基本についてのまとめ

Flutter基礎

Flutterの基礎について改めて理解を深めようと思い、今回はコンストラクタについてまとめました。
Flutterの基礎となる重要なものなので参考になれば幸いです。

コンストラクタとは

Flutterにおけるコンストラクタとは、下記のことを示します。

  • クラスのインスタンスを生成するときに呼び出されるメソッドや初期化処理のこと

Constructors are special functions that create instances of classes.

公式

Constructors
Everything about using constructors in Dart.

コンストラクタの中でもいくつか種類があります。

  • Generative constructor
  • Default constructor
  • Named constructor
  • Factory constructor etc …

その中で今回は、下記3つについて解説していきます。

  • Generative constructor
  • Default constructor
  • Named constructor

Factoryコンストラクタについては別途下記の記事にまとめてありますので興味ある方はご覧ください。

シンプルな例

種類問わず、まず簡単な例として以下のようなイメージがコンストラクタになります。

class Person {
  String name;
  int age;

  // これが「コンストラクタ」
  Person(this.name, this.age);
}

この部分Person(this.name, this.age);が、

  • インスタンス生成時に必要な値を受け取って
  • クラスの変数(name, age)をセットする

という 初期化処理を担っています。

前提

  • クラス
    • コードの設計図
    • 実体を持たないイメージ

class Person {
  String name;
  int age;
}
  • インスタンス
    • クラスの実体

  // このPerson('太郎', 20);がインスタンス(実体)
  var p = Person('太郎', 20);
  • コンストラクタとは
    • クラスからインスタンスを作るときに呼ばれる特別な関数
    • Dartではクラスの中で定義する(クラスと同名)

class Person {
  String name;
  int age;

  // コンストラクタ
  Person(this.name, this.age);
}

全体

class Person {
  String name;
  int age;

  // コンストラクタ
  Person(this.name, this.age);
}

void main() {
  // オブジェクトの生成(=コンストラクタ呼び出し)
  var p = Person('太郎', 20);

  print(p.name); // 太郎
  print(p.age);  // 20
}

各コンストラクタについて

Generative constructor(生成コンストラクタ)

Creates new instances and initializes instance variables.
新しいインスタンスを作成し、インスタンス変数を初期化します。

普段使用している通常のコンストラクタがこのジェネレーティブコンストラクタになります。
クラス名と同じ名前で定義し変数なども定義できます。

class Point {
  // インスタンス変数。
  double x;
  double y;

  // ジェネレーティブコンストラクタ
  Point(this.x, this.y);
}

Default constructor(デフォルトコンストラクタ)

If you don’t declare a constructor, Dart uses the default constructor

上記のような記載がある通り、コンストラクタを宣言しなくてもDartでは裏でコンストラクタが自動生成されます。それがデフォルトコンストラクタになります。

The default constructor is a generative constructor without arguments or name.

また、デフォルトコンストラクタはジェネレーティブコンストラクタの一種であることが上記の記載からわかると思います。(引数や名前がないジェネレーティブコンストラクタである。)

class Animal {                 // コンストラクタが書かれていない
  String type = 'unknown';
}

呼び出し↓
var a = Animal();
print(a.type); // unknownとprint (コンストラクタがソースコード上なくても使える)

実際は裏で下記のようなものが勝手に作られています。

// 裏ではこうなってる(実際のコードに記載はないが Dart が勝手に裏で()生成)↓
class Animal {
  String type = 'unknown';

  Animal() {
    // 何もしない(デフォルト generative constructor)
  }

without arguments or name.

とあるように引数を設定する場合は自分でGenerative constructorを定義する必要があります。

Named constructor(名前付きコンストラクタ)

Clarifies the purpose of a constructor or allows the creation of multiple constructors for the same class.

通常とは少し違うコンストラクタで下記のような利点があるコンストラクタが名前付きコンストラクです。

  • コンストラクタの目的を明確にする
  • 同じクラスに対して複数のコンストラクタを作成する
const double xOrigin = 0;
const double yOrigin = 0;

class Point {
  final double x;
  final double y;

  // コンストラクター本体が実行される前に、xとyのインスタンス変数を設定する。
  Point(this.x, this.y);

  // Named constructor
  Point.origin() : x = xOrigin, y = yOrigin;
}

まとめ

基本的なコンストラクタについて解説していきました。現場で使用する際に理解して使うことでより汎用的な使い方やレビューの際の意図の汲み取りなど活かせるかなと思います。

コメント等あればぜひXまでご連絡いただければと思います。

ではまた。

コメント

タイトルとURLをコピーしました