ヌルセーフティ: プログラム内でヌルを安全に扱い、ヌル参照エラーを回避する機能
はじめに
何気なく使っていた、Null Safety(ヌルセーフティ)について、調べたくなったので、備忘録として記載します。
見てくださった方にも、何かの助けになればと思います。
きっかけ
何気なく書いてたコードで、こんなコードがありました。
static File? backgroundImageFile;
File?の'?'って、どんな目的でつけてんだっけ?なんとなくは分かるけど、いざ説明してと言われると自信がないので、説明できるようにしておこうって思ったのがきっかけです。
Null Safety(ヌルセーフティ)の目的とは?
ヌルセーフティの目的は、変数や要素がヌルであるかどうかを静的にチェックし、ヌル参照エラーを回避することです。そのため、変数の型以外にもヌルセーフティを適用することで、コードの安全性と信頼性を向上させることができます。
File? はNullable型であり、File クラスのインスタンスまたは null のどちらかを保持することができます。Nullable型を使用することで、変数がnullである可能性を明示的に示すことができます。
File? の変数を宣言すると、それはFile クラスのインスタンスを保持することもできますし、nullを保持することもできます。ファイルパスがヌルの場合、代入される値は null となります。
以下は使用例です:
File? backgroundImageFile = null; // nullを代入
File? backgroundImageFile = File('path/to/file.jpg'); // Fileオブジェクトを代入
したがって、File? 型の変数は、参照先のファイルパスがヌルである場合、ヌルを保持することができます。これにより、変数の値がnullであるかどうかを明示的に示すことができます。
使用参照例
ヌルセーフティが適用される4つの要素の簡単な例を挙げておきます。
1.変数の型:
String? nullableString; // ヌルを許容するNullable型の変数
int? nullableInt; // ヌルを許容するNullable型の変数
List<String>? nullableList; // ヌルを許容するNullable型のリスト
2.関数の引数と戻り値の型:
void processString(String? input) { // 引数にヌルを許容するNullable型を使用
if (input != null) {
// ヌルでない場合の処理
}
}
String? getString() { // 戻り値としてヌルを許容するNullable型を使用
// ヌルかもしれない値を返す処理
return null;
}
3.リストやマップの要素型:
List<int>? nullableIntList; // ヌルを許容するNullable型の整数リスト
Map<String, String>? nullableStringMap; // ヌルを許容するNullable型の文字列マップ
4.クラスのプロパティやメソッドの戻り値やパラメータ:
class MyClass {
String? nullableProperty; // ヌルを許容するNullable型のプロパティ
void processValue(int? value) { // ヌルを許容するNullable型のパラメータ
if (value != null) {
// ヌルでない場合の処理
}
}
String? getString() { // ヌルを許容するNullable型の戻り値
// ヌルかもしれない値を返す処理
return null;
}
}
まとめ
ヌルセーフティは、変数や要素がヌルであるかどうかを静的にチェックし、ヌル参照エラーを回避するための安全なプログラミング手法です。
具体的には、Nullable型を使用して、ヌルを許容するかどうかを明示的に示し、安全呼び出し演算子やnullチェックを使用してヌルに対する操作を安全に行う事ができます。
これにより、実行時のヌル参照エラーを減らし、コードの安全性と信頼性を向上させる事ができます。
一言で説明すると
ヌルセーフティとは、プログラム内でヌルを安全に扱い、ヌル参照エラーを回避する機能です。