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