はじめに
普段はrailsを扱っていますがflutterも扱える様になりたくてDartの勉強もしております。
今回は定数のfinalとconstの違いについてまとめようと思います。
final定数とは
・実行時に値が初期化される
・値が初期化された後は変更出来ない
const定数とは
・コンパイル時に値が初期化される
・値が初期化された後は変更出来ない
finalとconstの違いは初期化されるタイミングに違いがあります。
実例①
//final定数を使用する
void main() {
final now = DateTime.now();
print(now);
//実行結果
//2022-07-19 08:26:21.350
}
final定数では実行時に値が初期化される為、コンパイル時に値が定まっていなくてもエラーが発生しません。
ですがconst定数では値がコンパイル時に定まってなければいけません。
上記のfinalをconstにするとエラーが発生します。
//const定数を使用する
void main() {
const now = DateTime.now();
print(now);
//実行結果
//Cannot invoke a non-'const' constructor where a const expression is expected.
}
実例②
次はMap型での例です。
void main() {
Map<String, String> addressList = {
'taro': '千葉',
'suzuki': '北海道',
'sato': '埼玉',
'kimura': '東京',
};
final firstAddress = addressList['taro'];
print(firstAddress);
//実行結果
//千葉
}
上記もfinalの部分をconstに変更するとエラーが出ます。
どう使い分けていくのか
まだまだ勉強初期段階ではありますがこの2種類の定数はどの様に使い分けていくのが良さそうでしょうか。
final定数
実行時まで値が分からけど初期化された後は変更したくない場合はfinal定数で表現する。
例えば現在時刻やその配列に入っている最初の値を取り出す時など、実行時のその時々で値が動的に変化するけどその後は変更したくない場合等です。
const定数
コンパイル時に値が既に定まっていてその後も変更したくない場合はconst定数で表現する。
終わりに
今回はDartのfinal定数とconst定数の違いについてアウトプットしました。
この辺りの使いわけをきっちりやっていくことで余計なバグを引き起こさないであったりとかコードを読んだだけでその定数の役割がイメージでき、可読性も向上しそうです。
私もこの辺りの違いを認識してコードを読んで書いていきたいと思います。
読んで頂きありがとうございました。