Null Safety 入門
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 23/110。
プログラミングにおけるバグの最も一般的な原因の1つは、存在しない値を使用しようとすることです。Dartでは、この特別な「値の不在」はnullで表されます。Dartのnull safety機能は、コードが実行される前にこれらのエラーをキャッチするのに役立ちます。
Null safetyがない場合、どの変数もnullになる可能性があり、それを使用しようとすると実行時にクラッシュが発生します:
// 以前のDart(Null safetyなし)
String name; // nullになる可能性があります!
print(name.length); // nameがnullの場合、クラッシュしますNull safety(Dart 2.12以降)が有効な場合、コンパイラは null を保持できる変数と保持できない変数を区別します。デフォルトでは、変数は非 null 許容(non-nullable)であり、常に有効な値を含んでいる必要があります:
String name = 'Alice'; // 値を持つ必要があります
print(name.length); // 安全 - name が null になることはありませんコンパイラは、非 null 許容型の変数が null になる可能性があるコードのコンパイルを拒否します。これにより、エラー検出が実行時からコンパイル時へと移り、プログラムの信頼性が向上します。今後のレッスンでは、本当に必要な場合に null 許容型を宣言する方法や、null になる可能性のある値を安全に扱うために Dart が提供している演算子について学んでいきます。
チャレンジ
簡単非ヌル(non-nullable)変数の重要性を示す、シンプルな連絡先カードシステムを構築しましょう。すべての連絡先が有効で保証された情報を持たなければならないシステムを作成します。
コードを2つのファイルに整理します:
contact.dart: 個人の連絡先情報を表すContactクラスを定義します。Null Safety(空安全)を扱っているため、すべてのフィールドは有効な値を持つ必要があり、データの欠落は許されません!クラスには以下のものを含めてください:- 連絡先の名のたの
String firstName - 連絡先の姓のための
String lastName - 連絡先のメールアドレスのための
String email - 電話番号の桁数のための
int phoneDigits - これら4つの値をすべて受け取るコンストラクタ
- 名と姓をスペースで結合して返すゲッター
fullName - 連絡先情報を表示する
displayCard()メソッド
- 連絡先の名のたの
main.dart: 作成した連絡先クラスをインポートし、すべてのフィールドに値があることが保証されていることを示すために、2つの連絡先を作成します:- 名が
'Emma'、姓が'Wilson'、メールが'emma@mail.com'、電話の桁数が10の連絡先を作成します - 名が
'James'、姓が'Brown'、メールが'james@work.com'、電話の桁数が11の連絡先を作成します - 上記の順序で、各連絡先の
displayCard()を呼び出します
- 名が
displayCard() メソッドは、以下の形式で正確に出力する必要があります:
--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]すべての変数が実際の値で初期化されなければならないことに注目してください。これが Null Safety の仕組みです!コンパイラは、fullName や email、その他のフィールドにアクセスしたときに、それらが常に有効なデータを含んでいることを保証します。
期待される出力:
--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11チートシート
Dartは、存在しない値を使用することによって発生するバグを防ぐために、ヌルセーフティを使用します。特別な値である null は、値の欠如を表します。
ヌルセーフティが有効な場合(Dart 2.12以降)、変数はデフォルトで非ヌル許容(non-nullable)です。つまり、常に有効な値を含んでいる必要があります:
String name = 'Alice'; // 値を持つ必要があります
print(name.length); // 安全 - nameは決してnullになりません非ヌル許容の変数が null になる可能性がある場合、コンパイラはコードのコンパイルを阻止し、エラー検出を実行時からコンパイル時へと移行させます。
自分で試してみよう
import 'contact.dart';
void main() {
// TODO: 次の内容で最初の連絡先を作成してください:
// - 名: 'Emma'
// - 姓: 'Wilson'
// - メール: 'emma@mail.com'
// - 電話番号の桁数: 10
// TODO: 次の内容で2番目の連絡先を作成してください:
// - 名: 'James'
// - 姓: 'Brown'
// - メール: 'james@work.com'
// - 電話番号の桁数: 11
// TODO: 各連絡先に対して順番に displayCard() を呼び出してください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ