Immutable(不変)データとは、初期化後の変更ができないデータ。
文字列(String)、数値(int,doubleなど)、bool値(boolean)の値は変更することができない。
String型として型注釈(型推論)された変数には、文字列(データ)が格納される訳ではない。
文字列データのメモリの場所への参照が格納される。
と言っている。筆者はGDEみたい。こういうの公式ドキュメントにあるのだろうか。無い場合言語仕様見ればあるのだろうか。
final変数でない変数は再代入が可能であり、再代入された変数はその文字列データを指し示すようになる。しかし一度生成された文字列データ自体(の内容・長さ)は変わらない。
var str = "This is a string.";
str = "This is another string.";
上記のサンプルではstrという名の変数が宣言されている。
文字列データ("This is a string."
)はメモリに配置される。
変数strにはそのメモリの場所が格納される。
2行目では新しい文字列データが生成され、そのメモリの場所がstrに格納される。
最初の文字列データ自体は消えないが、コード内に、最初の文字列データにアクセスできる変数がなくなったので、unreachable(アクセス不可能)とマークされて、Dartのガベージコレクションにより最終的にはメモリが解放される。
immutableデータを使う利点はいくつかある。
immutableデータを使うとスレッドセーフとなる。immutableデータの内容を変えることはできないので、いかなるコードがアクセスしていても、データが同じであることが保証される。
参照を渡す際に、防御的コピーをする必要がない。状態を維持するために複雑なコードを書く必要がないので変数の中身を推測しやすい。
final、constキーワードを用いたサンプルによりDartのビルトインimmutable機能について議論していく。
変更すべきでない二つのデータを宣言する。
Final variables vs. constants
final変数は一度だけ初期化が可能。必ず初期化する必要がある。…