🍃

【Dart】Null Safetyについて

2022/04/04に公開

はじめに


zenn初投稿です!

dartにNull Safetyが導入され、私が開発しているJobhunにも導入したのでそこで得た知見の共有

そもそもNull Safetyとは??


× 変数にnullが入ることを防ぐ

nullかもしれない変数に安全にアクセスする

→変数に「nullかもしれない変数」と「nullにならない変数」で区別する

このNull Safetyによって意図せず変数にnullが入ってしまうことを防ぐことができるのでややこしい要素ではあるがクラッシュの減少に寄与する

Null Safetyの基本


従来のコード

main() {
  int value = null;
  print(value);  //→ null
}

変数にnullを代入していてもエラーが出ることはありません

Null Safety導入後は以下のようなエラーが発生します

Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
  int value = null;

このエラーはintの変数にはnullを入れることができないというエラーです

もし、エラーを吐かないようにするには以下のようなコードを書く必要があります

main() {
  int? value = null;
  print(value);  //-> null
}

型の後に?をつけることによってnullを許容する型に変更できます

Null許容型(Nullable)の変数


valueがnullである可能性があるため、いきなりプロパティやメソッドにアクセスすることはできません

void main() {
  int? value = null;
  print(value.isEven); // -> コンパイルエラー!
}

これを回避するにはvalueがnullかどうか判断する記述が必要です

void main() {
  int? value = null;
  print(value?.isEven); // -> null
}

Null非許容型(Non-nullable)の変数


Non-nullableな変数はnullでないことが証明されているため、プロパティやメソッドにアクセスする際の問題は発生しません

void main() {
  int value = 2;
  print(value.isEven); // -> true
}

ただし、nullを許容できないので、nullを代入したり、Nullableな変数を代入することができません

void main() {
  int value = 2;
  int? value2 = getNullableValue(); // Nullableな変数
  value = value2;  // -> コンパイルエラー
}

そのため、nullでないことを保証するコードを記述する必要があります

void main() {
  int value = 2;
  int? value2 = getNullableValue();
  value = value2 ?? 0;  // 例えば ?? でデフォルト値を与えてあげればOK
}

Null Safetyなコードの書き方


Null Safetyに記述できる手段は様々あるので参考にしてみてください

① returnを使う

void main() {
  int? value = null;

  // nullの場合はreturnで返す
  if (value == null) {
    return;
  }

// この時点でvalueがnullであることはないのでNull Saftyになる
  print(value.isEven);
}

② nullではない値を代入する

int? value = getNullableValue();
value = 2;
print(value.isEven); // 直前で Non-nullable な値を代入しているため OK

??を使用する

int? value = getNullableValue();
print((value ?? 0).isEven); // ?? で null の場合の値を与えているため OK

④ if文で分岐させる

int? value = getNullableValue();
if (value != null) {
  print(value.isEven); // value が null の場合はここを通らないため OK
}

最後に

最後にはなりますが、現在開発しているアプリに関してご紹介させていただきます。

就活の管理を行うアプリJobhunです!
Jobhunは「就活状況を一括管理したい...」 「自分が就活の時、予定を組むのが大変だった...」という就活生の声から生まれたアプリです。そのため、実際に就活を経験してきた方の意見を参考に、「本当に必要な機能」をまとめました!

以下のような機能があります。

  • 志望企業管理機能
  • 就活用カレンダー機能
  • ES管理機能 etc...

気軽に就活管理ができるようになっているので、是非ダウンロードしてみてください!!
LPIOSダウンロードAndroidダウンロード

Discussion