🌟

non-nullableなクラスメンバをコンストラクタで初期化する方法

2021/11/24に公開
class ConstructorTest{
  int testId;
}

のtestIdを初期化する場合を例にする。

1.引数で渡す

ConstructorTest.constructor1(this.testId);

ConstructorTest constructor1 = ConstructorTest.constructor1(1);

引数1つは必須なのでnon-nullableでOK

2.required付き名前付き引数で渡す

ConstructorTest.constructor2({required this.testId});

ConstructorTest constructor2 = ConstructorTest.constructor2(testId:2);

required指定でtestIdは必須なのでOK

3.デフォルト値付き名前付き引数で渡す

ConstructorTest.constructor3({this.testId = -5});

ConstructorTest constructor3 = ConstructorTest.constructor3();

デフォルト値(-5)を設定しているのでOK

4.nullable名前付き引数で渡す

ConstructorTest.constructor4({int? testIdVal}) : testId = testIdVal ?? -1;

ConstructorTest constructor4 = ConstructorTest.constructor4();

イニシャライザリストでnullチェックをしてtestIdを設定しているのでOK。ちなみにコンストラクタ関数内で初期化するのは駄目。

  ConstructorTest.constructor5(int? testIdVal){
    testId = testIdVal ?? -1; //これは駄目
  }

↑で初期化したい場合はlate指定(late int testId;)で宣言すればOK


上記をまとめてみると

class ConstructorTest{
  ConstructorTest.constructor1(this.testId);
  ConstructorTest.constructor2({required this.testId});
  ConstructorTest.constructor3({this.testId = -5});
  ConstructorTest.constructor4({int? testIdVal}) : testId = testIdVal ?? -1;  //constructor3のnull-aware operatorバージョン
  
  int testId;
  int testId2 = -1; //Constructorで初期化していないのでデフォルト値を入れる必要がある

}

void main() {
    ConstructorTest constructor1 = ConstructorTest.constructor1(1);
    ConstructorTest constructor2 = ConstructorTest.constructor2(testId:2);
    ConstructorTest constructor3 = ConstructorTest.constructor3();
    ConstructorTest constructor4 = ConstructorTest.constructor4();

    print('constructor1.testId = ${constructor1.testId}');
    print('constructor2.testId = ${constructor2.testId}');
    print('constructor3.testId = ${constructor3.testId}');
    print('constructor4.testId = ${constructor4.testId}');
}

//constructor1.testId = 1
//constructor2.testId = 2
//constructor3.testId = -5
//constructor4.testId = -1

Discussion