Dartのstatic/const/finalについて
今回はDartの変数定義の時に使用する修飾子についてまとめていきたいと思います。普段はfinalを主に使用しておりstaticは他のコードを参考に使うことはあるけど自分に落とし込んでいないので頭に入れていきたいです。
final
プログラム開始後のある時点で一回だけ初期化され、初期化以降は代入などを通じて変更されない・できないことが保証される。
const
コンパイル時に確定している値であることを示すための指定。正直これはあまり使用しないです。コンパイル字定数と言います。変数の再代入も不可で、finalの意味に加え、constな変数が指す先のメモリ領域の内容も変更不可であることを表す。
static
クラスのフィールド変数に指定し、その変数がインスタンスごとに保持されるのでなく、クラスで一つの実体を持つことを宣言する。
そもそもフィールドとメソッドは大きく二つに分けられます。
①staticなし:インスタンスフィールド・インスタンスメソッド
②staticあり:クラスフィールド・クラスメソッド
例え話
日本人クラスを定義して日本人オブジェクトが二つ生成された時、それぞれのオブジェクトに名前、年齢、通貨、首都フィールドを持ちます。
名前と年齢フィールドは基本的にオブジェクト毎に異なります。そのためstaticのつかないインスタンスフィールドになります。インスタンスフィールドはオブジェクト(インスタンス)毎のフィールドだからです。
通貨と首都は日本人なら、通貨は「円」、首都は「東京」で共通です。オブジェクト毎にことならないため日本人オブジェクトごとに保持しなくても良いのです。
こんな時にやってきました。staticの付くクラスフィールドにして日本人クラス共通のフィールドにします。これはデータを重複して保持することを避けることができます。
例
class Japanese {
static String currency;
static String capital;
}
main() {
static String name; //エラー
}
まとめ
staticは出てくるたびにこれなんだっけ?となってしまっていたので調べられてよかったです。staticがついているのはクラスフィールドなんですね!また、コードを言語化して説明できないことがたびたびあるので、クラスフィールドとインスタンスフィールドを理解できたこともよかったです。
参考:https://www.youtube.com/watch?v=IWuGlFIFvXg