Dart PR

【Dart】コンストラクタのデフォルト引数について

記事内に商品プロモーションを含む場合があります

Dartのコンストラクタのデフォルト引数でハマったので備忘録として残しておく。

コンストラクタのデフォルト引数

定数の場合

シンプルに引数内に書ける。

class Hoge {
  Hoge([this.num = -1]);
  int num;
}

// 名前付き
class Moge {
  Moge({this.num = -1});
  int num;
}

呼び出してみると以下のような感じ。

  final h1 = Hoge();
  final h2 = Hoge(0);
  print('${h1.num}, ${h2.num}');  // -1, 0
  
  final m1 = Moge();
  final m2 = Moge(num: 0);
  print('${m1.num}, ${m2.num}');  // -1, 0

定数でない場合

定数でない場合は、Initializer listを使う。

import 'dart:math' as math;  // 乱数を使うため

class Hoge {
  Hoge(): num = math.Random().nextInt(10);
  int num;
}

あれ?これって引数指定できないじゃん...。
ということで次で実装。

引数を指定しない場合にデフォルト値になる引数

オプショナル型を使って実装します。

class Hoge {
  Hoge([this.num]){ 
    // nullの場合にデフォルト値を渡す
    num = num ?? math.Random().nextInt(10);
  }
  // オプショナル型
  int? num;
}

// 名前付き
class Moge {
  Moge({this.num}){
    num = num ?? math.Random().nextInt(10);
  }
  int? num;
}

これで以下のように初期化できる。

final h1 = Hoge();
final h2 = Hoge(0);
  
final m1 = Moge();
final m2 = Moge(num: 0);

継承した場合

superを使って親にアクセス。

class Parent {
    Parent({this.parentNum}){ 
    // nullの場合にデフォルト値を渡す(0 - 9)
    parentNum = parentNum ?? math.Random().nextInt(10);
  }
  // オプショナル型
  int? parentNum;
}


class Child extends Parent {
  Child({super.parentNum, this.childNum}){
    // 10 - 19 の乱数
    childNum = childNum ?? math.Random().nextInt(10) + 10;
  }
  int? childNum;
}

以下のように呼び出せる。

var c1 = Child();
print('${c1.parentNum}, ${c1.childNum}');     // 0,10

var c2 = Child(parentNum: -1);
print('${c2.parentNum}, ${c2.childNum}');     // -1, 19

var c3 = Child(childNum: -2);
print('${c3.parentNum}, ${c3.childNum}');     // 7,-2

var c4 = Child(parentNum: -1, childNum: -2);
print('${c4.parentNum}, ${c4.childNum}');