プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

Dart の const construtor について

Flutter を使いたいと思い、 Dart 始めました。

リファレンス読んだり、本読んだりして、ある程度概要はつかめたのですが、いまひとつよくわからないのが、 const constructor (定数コンストラクタ)です。

疑問点

公式の説明にあるように、コンパイル時に定数にすることができる、ということなんですが、

class A {
  final number;
  const A(this.number);
}
void main() {
  const a = A(10);  // 定数オブジェクト
  var b = A(20);      // 定数オブジェクトではない

  print(identical(a,b));
}

とすると、

false

となるところまでは理解できるのですが、クラスAのフィールドは final なので、変数 b の中身はどうせ変更できないし、『定数オブジェクトではない』といっても、どういう意味があるんだろうか?もっといえば、 const constructor に対しては常に定数オブジェクトが生成される、というのでいいんじゃないか?と思っていました。

解決

いろいろと調べているうちに、 const constructor の引数として変数を渡すときがあることに気が付きました。 つまり、

  var v = 20;
  // var b = const A(v);  // コンパイルエラー

となるということです。この場合は、

  var b = A(v);

とする必要があります。

なるほど!そういうことなんですね。

普通の constructor と const constructor の両方を定義できないので、 const constructor が定数オブジェクトを生成しない形で使うことも許されている、ということなんですね。

あー、すっきりした。

参考

上記についての直接の言及はないですが、こちらの記事を読んでいるうちに気が付きました。

dart - How does the const constructor actually work? - Stack Overflow