generated at
null安全
null safety
そもそもnull安全って何?
null, nil, Noneなどが原因で実行時エラーにならない機構のこと
nullチェックをコンパイラが強制する
型で表現されることが多い
他は知らんmrsekut
non-nullnullableの両方の性質を持つ
片方だけのものはnull安全ではない




何が嬉しいのか
null安全でないプログラムを書いたらコンパイル時にコンパイラが怒ってくれる
null checkを強制される
interfaceを見るだけで、それがnullableなのかどうかを判断できる
コードを実行しなくてもプログラマが判断できる。
キャストはキャストでも、null安全な言語ではnull安全なキャストしか許容されないのか #??


null安全がないとどうなるのか
プログラマが自分で気をつけないといけない
うっかりnull値にアクセスしてしまう
nullに対してメソッドを呼んだり、計算させようとすると実行時エラーが起きる
js
// JavaScript let s = null; s.length; // TypeError: Cannot read property 'length' of null
この例はC言語とかのほうが良い気がするmrsekut
interfaceでの型付けに、nullが入りうるものとそうでないものの区別がつかない
実際は「 -1 のときは、エラーにする」ので、型を見るだけじゃわからない



nullableであることを型で表現できない場合どうするか
命名規則で「この変数はnullになり得ますよ」を表現したり
裁量は完全にプログラマに委ねられる
コンパイラも怒ってくれない


null安全な言語でない場合、nullableとnon-nullの線引がない
だから例えば、 string 型に null を代入できてしまう
だとするとどうするかというと、テストを書くときにいちいち全部の値に対して、これはnullかどうか、の判定を書かないといけない
例えばJavaやScalaはnullbaleにするOptionが実装されたが、元々ある型にnullを代入できるから、non-nullではない
なので「null安全ではない」
Javaでは参照型のみNullの代入が出来るらしい
参照型がわからんけど、
とりあえず本来は全ての型がNull代入できてはいけない




モダンな言語はnull安全になるように設計されている ref
例えばnull安全でないJavaScript→null安全なTypeScript、など



null安全でない言語
Javaはnull安全ではない
なので、Optionalクラスを自作して?表現したりする
しかし、non-nullの性質はない
参照型のみNullの代入が出来る
Objective-C
Scalaも違うらしい ref
どのへんが違うかは知らん
Javaと同じなんかな
Go
Goのポインタにはnilを代入でき、nilチェックは強制されない
たぶん
動的型付けの言語の多く
null安全ではないが、実行時エラーは起きず、例外として捕捉される



Maybe, Option
↑と異なり型を見るだけで失敗する可能性があることがわかる
↑と同様に失敗理由を伝えることができない




しかし抜け道が存在するもある
型検査は通ったはずなのに、nullが原因で実行時エラーが起きるパターン
TS
anyを使って型付けをした
間違った型を書いた
型検査は通るが、実際に入るデータはnullbaleであり、落ちるみたいな
これは実行時には型検査されないTS特有なのか #??
Rustなど強めの型検査があり、実行時にも?なんかする?言語ではどうなんだろう
キャスト
strict: true にしてないと、nullableのときに怒ってくれない


nullableを快適に使うための言語の仕組み ref
type guardとか
Monad
hsのMaybeはそもそもnullじゃないので別な気もするけどmrsekut

誤用するぐらいならnullのほうが良い場合がある
適当に ?? 0 ?? "" とすると、DBに誤った値が入ることがある


JavaにはNullableとかNonNullアノテーションというのがあるらしい
なんですかこれは #??



関連

null安全の誕生 ref
ECOOPというカンファレンスでBertrand MeyerVoid Safetyとして発表した
その後Effect Systemに導入された



参考
Javaの話
null安全を誤解している人達へのメッセージ - Qiitaの質問に対する別の人の簡素な回答