はじめに
本記事ではDartの変数についてまとめます。Flutter開発入門の前回の記事は以下です。
Dart変数の基本
Dartでは、変数は値への参照を保持します。例えば、var name = ‘Bob’;というコードでは、nameという変数が文字列’Bob’を指しています。また、Dartは変数の型を自動的に推論しますが、明示的に型を指定することも可能です。
明示的に変数を宣言する場合には以下のような形で記述します。
String name = 'Bob'; // String型として明示的に宣言
Null安全性
Null安全性(Null Safety)とは、プログラミング言語において、null
値が原因で発生するエラーを未然に防ぐための仕組みです。Dart言語では、Null安全性を導入することで、変数がnull
値を持つ可能性がある場合、その変数に対して無効な操作を行わないようにコンパイル時にチェックを行います。
Dartは「Null安全性」をサポートしており、これによりNull参照エラーを防ぎます。Null参照エラーとは、null
となっている変数に対してプロパティやメソッドを呼び出そうとしたときに発生するエラーです。
NullableとNon-nullableを定義するには以下のように記述します。
String? name; // Nullable型
String name; // Non-nullable型
変数のデフォルト値
Nullable型の未初期化変数はデフォルトでnull
に設定されます。Non-nullable型の場合、明示的に初期値を設定しないとコンパイルエラーになります。
例えばNullableの値をprintしてみると「null」という表示がされますが、Non-nullableの場合は以下のようなエラーがコンパイル時に表示されます。
サンプルコード
String name2; // Non-nullable型
print(name2)
エラー
compileDDC
main.dart:7:9: Error: Non-nullable variable 'name2' must be assigned before it can be used.
print(name2);
遅延初期化
遅延初期化(Late Initialization)とは、変数の宣言時に初期化せず、必要なタイミングで初期化を行う手法です。Dartでは、lateキーワードを使用して遅延初期化を行います。これにより、通常のNon-nullable変数として扱いながらも、宣言後に初期化を遅らせることができます。以下使い方の例になります。
late String description;
void main() {
// ここではまだdescriptionは初期化されていないので使用できない
description = 'This is a description.';
print(description); // 'This is a description.'が出力される
}
このコードでは、description
という変数をlate
として宣言しています。この変数は、main
関数内で初めて値が設定され、print
メソッドによって出力されます。
定数変数: finalとconst
final変数は一度しか設定できない変数であり、const変数はコンパイル時に定数であることが保証されます。finalやconstを使用することで、変更不可能な値を扱うことができます。
final String nickname = 'Bobby';
const int bar = 1000000;
finalとconstの使い分け
※イミュータブル性(Immutability)とは、変数が一度作成された後に、その状態や内容を変更できない性質を指します。
- 値が実行時に決まるかコンパイル時に決まるか
- 値が実行時に決定される場合、例えばユーザーからの入力や現在の日付、APIからのデータなどの場合は、finalを使用します。
- 値がコンパイル時に確定している場合、つまり不変であることが保証されるリテラル値や数式の場合は、constを使用します。
- オブジェクトのイミュータブル性
- constを使用すると、そのオブジェクトは完全にイミュータブルとなり、その内容も変更できません。これは、データの完全な安全性が求められる場合に有効です。
- finalを使用した場合、オブジェクトそのものは変更できませんが、そのフィールドや要素は変更可能です。
まとめ
この記事では、Dart言語における変数の基本的な使い方から、Null安全性、デフォルト値、遅延初期化、そして定数変数の使い分けまでを詳細に解説しました。Dartの変数は、プログラムの信頼性と柔軟性を高めるために多くの機能を提供しています。特に、Null安全性はプログラムのエラーを未然に防ぎ、finalとconstを適切に使い分けることで、イミュータブル性を確保しつつ効率的なコードが書けます。これらの概念を理解し、正しく活用することで、Dartでの開発がより安全で効果的になります。
Flutter開発入門の次の記事はこちらです。