final と const の違い


「変更できない値」を作るとき、2つの書き方があります。

final と const の違い – どっちを使う?

final – 実行時に1回だけ決まる

final String name = '花子';  // これはもう変更できない
name = '太郎';  // ❌ エラー!

final DateTime now = DateTime.now();  // 実行したときの時刻
final int random = Random().nextInt(100);  // 実行したときのランダム値

ポイント: プログラムを実行したときに値が決まる

const – コンパイル時に決まる(完全に固定)

const String appName = 'Concert Manager';  // 絶対に変わらない
const int maxStudents = 100;  // 定数

const double pi = 3.14159;  // 数学の定数

ポイント: プログラムを書いた時点で値が決まっている

決定的な違い:

// ✅ final は実行時の値でOK
final DateTime now = DateTime.now();

// ❌ const は実行時の値はダメ(コンパイル時に分からないから)
const DateTime now = DateTime.now();  // エラー!

// ✅ const は固定値だけ
const String title = 'アプリ名';
const int version = 1;

Flutter の Widget で使うとき:

// const を付けると、Flutterが再利用してくれる = 高速化!
const Text('タイトル')
const SizedBox(height: 20)
const Divider()

// 変数を使う場合は const 付けられない
Text('生徒数: $count')  // count は変わるので const は付けられない

const Widget は再描画されない = パフォーマンス向上!

リストでも使える:

// final リスト - 中身は変更できる
final List<String> fruits = ['りんご'];
fruits.add('バナナ');  // ✅ OK

// const リスト - 中身も変更できない
const List<String> colors = ['赤', '青'];
colors.add('緑');  // ❌ エラー!

使い分けのコツ:

使う場面使うもの
絶対に変わらない値(アプリ名、バージョン番号)const
API取得データ、現在時刻、ユーザー入力final
変更する可能性があるvar または型指定
Widget で固定の値(Text, Icon など)const を付ける

まとめ

一言まとめ: final は「実行したときに決まる、変更不可」、const は「最初から決まってる、完全固定」。迷ったら final を使えばOK! 😊