🏅
Dart finalとconstの違いについて
Dartで一度値を決めたらその後変更できないようにするにはfinal
とconst
の2つを使います。
僕が現在業務で使っているJavaではfinal
はありますがconst
がないため、両者の違いが何なのかを調べたメモになります。
環境
- macOS Big Sur Version 11.3.1
- Flutter 2.2.0
- Dart 2.13.0
final vs const
2つの違いは「値が決まるタイミング」にあります。
a const variable is a compile-time constant.
-
const
-
const
はコンパイル時に値が代入され、それ以降変更できない
-
-
final
-
final
はプログラムを実行して値が代入されたあと変更できない
-
void main() {
const String constStr = 'const';
final String str = 'abc';
// 以下はエラー
constStr = 'change'; // Constant variables can't be assigned a value.
str = 'chnage'; //The final variable 'str' can only be set once
}
コレクションでも同じくエラーになります。
void main() {
const foo = [1,2,3];
foo[0] = 2; // Uncaught Error: Unsupported operation: indexed set
print(foo);
}
注意点として、以下のようにfinal
だとリストの要素を変更はできますが新しいリストを代入できません。あくまでfinal
は再代入を禁止するもののよう。
void main() {
final foo = [1,2,3];
// これは変更可能
foo[0] = 2;
// これはエラー
foo = [1,1];
print(foo);
}
また別の観点から考えると、インスタンス変数はプログラム実行時にならないとそもそも値が代入されないので、コンパイル時に値が決まるconst
は使用不可となります。
Note: Instance variables can be final but not const.
Discussion