Dartの変数宣言(var/final/const)の違い

はじめに

当たり前ですが、基本公式のLanguage Tourを読む方が正確。
この記事はLanguate Tour + αを日本語かつ自分の言葉でまとめたものです。

var

varは代入が何回でも可能な変数を定義する時に使う。

var name = 'apple';
name = 'google';
print(name); // google

変数宣言時に値を代入する場合は、値の型を推測してその型が変数の型になる。

var name = 'apple'; // nameの型はString
name = 1; // Stringじゃないので代入不可能

変数宣言時に値を代入せず、宣言するだけにした場合は代入する値の型は自由になる。

var name; // ちなみにこの時点での値はnull
name = 'apple';
name = 1; // 代入可能

dynamicを使えば宣言時に値を代入しても型を動的に変えられる。

dynamic name = 'apple';
name = 1; // 代入可能

varを使う代わりに型を変数名の前に書くことで型を明確にすることができる。

String name;
name = 'apple';
name = 1; // Stringじゃないので代入不可能

String id = 1; // Stringじゃないので代入不可能

final

finalは代入が1回のみ(宣言時)の変数を定義する時に使う。

final name = 'apple';
name = 'google'; // 代入不可

1回のみ、かつ、宣言時なので、宣言した後に代入することはできない。

final name;
name = 'apple'; // 代入不可

finalの後に型を書くことでその変数の型を明確にすることができる。

final String name = 'apple'; // 型はString

const

constはコンパイル時定数を定義する時に使う。constが個人的には理解に時間がかかった。
「コンパイル時定数」という言葉はただの自分の日本語訳なのでDart公式のLanguage Tourに書かれている英語の説明の方がわかりやすいかも。

A final variable can be set only once; a const variable is a compile-time constant. (Const variables are implicitly final.)

constはコンパイル時に値が確実に決まる(値が定数である)finalという認識。

const name = 'apple';
const id = 1;

例えば、finalでList型を宣言できるが、List型は動的なのでconstでは宣言できない。

final list = [];
// const list = []; と定義できない
list.add(2);
print(list) // [2]

同様にvarで宣言した変数をconstに代入することもできない。

var name = 'apple';
final company = name;
// const company = name; と定義できない
name = 'google';
print(company) // apple

※この記事では説明しないが、constは変数定義のときだけでなくコンストラクタ使用時に値の方にも使われるので注意。

参考

www.dartlang.org