1. ホーム
  2. dart

[解決済み] Dartの「const」キーワードと「final」キーワードの違いは何ですか?

2022-03-16 13:21:12

質問

とはどのような違いがあるのでしょうか? constfinal というキーワードをDartで使うのですか?

どのように解決するのですか?

dartのサイトに投稿があり、かなりうまく説明されています。

最終的に

final"は、単一代入:最終的な変数またはフィールドを意味します。 イニシャライザを持つ。一旦値が割り当てられたら、final変数の値は変更できません。 変数 .


コンスタントです。

Dartでは、もう少し複雑で微妙な意味を持つconstがあります。 . const [1, 2, 3] のようにコレクションを作成するときや、const Point(2, 3) のようにオブジェクトを (new ではなく) 構築するときに使用できます。ここで、constとは、オブジェクトの深層部の状態をすべてコンパイル時に決定でき、オブジェクトがフリーズして完全にイミュータブルになることを意味します。

<ブロッククオート

Constオブジェクトには、いくつかの興味深い性質と制約があります。

<ブロッククオート

コンパイル時に計算可能なデータから作成する必要があります。constオブジェクトは、実行時に計算する必要があるものにはアクセスできません。1 + 2 は有効な const 式ですが、new DateTime.now() はそうではありません。

<ブロッククオート

これらは深く、推移的に不変である。コレクションを含む最終フィールドがある場合、そのコレクションはまだミュータブルである可能性があります。constコレクションがあれば、その中のすべてのコレクションは再帰的にconstでなければなりません。

<ブロッククオート

それらは 正規化 . これは、文字列のインターリングのようなもので、与えられた const 値に対して、1 つの const オブジェクトが作成され、const 式が何度評価されても再利用されます。


で、これはどういうことかというと

コンスタントです。
持っている値が実行時に計算される場合 ( new DateTime.now() など)を使用すると ない はconstを使用します。しかし、コンパイル時に値が分かっている場合 ( const a = 1; を使用する必要があります。 const オーバー final . このほかにも constfinal . まず、もしあなたが const として宣言する必要があります。 static const ではなく、単に const . 次に、もしあなたが const コレクションを使用すると、その内部はすべて const . もしあなたが final コレクションを使用すると、その内部はすべて ではない final .

ファイナル
final を超えて使用する必要があります。 const は、コンパイル時に値がわからず、実行時に計算/取得される場合です。HTTP レスポンスを変更できないようにしたい場合、データベースから何かを取得したい場合、 あるいはローカルファイルから読み込みたい場合は、次のようにします。 final . コンパイル時に判明していないことは、すべて final オーバー const .


とは言うものの、どちらも constfinal のフィールドは再割り当てできません。 final オブジェクトは、それが const または final とは異なり、再割り当てが可能です。 const ).