🏅

Dart finalとconstの違いについて

2021/08/07に公開

Dartで一度値を決めたらその後変更できないようにするにはfinalconstの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