null安全
null safety
そもそもnull安全って何?
null, nil, Noneなどが原因で実行時エラーにならない機構のこと nullチェックをコンパイラが強制する
型で表現されることが多い
他は知らんmrsekut.icon
片方だけのものはnull安全ではない
何が嬉しいのか
null安全でないプログラムを書いたらコンパイル時にコンパイラが怒ってくれる
interfaceを見るだけで、それがnullableなのかどうかを判断できる
コードを実行しなくてもプログラマが判断できる。
キャストはキャストでも、null安全な言語ではnull安全なキャストしか許容されないのか #?? null安全がないとどうなるのか
プログラマが自分で気をつけないといけない
うっかりnull値にアクセスしてしまう
nullに対してメソッドを呼んだり、計算させようとすると実行時エラーが起きる code:js
// JavaScript
let s = null;
s.length; // TypeError: Cannot read property 'length' of null
この例はC言語とかのほうが良い気がするmrsekut.icon
interfaceでの型付けに、nullが入りうるものとそうでないものの区別がつかない
実際は「-1のときは、エラーにする」ので、型を見るだけじゃわからない
命名規則で「この変数は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
どのへんが違うかは知らん
Javaと同じなんかな
Go
たぶん
動的型付けの言語の多く
null安全ではないが、実行時エラーは起きず、例外として捕捉される
Maybe, Option
↑と異なり型を見るだけで失敗する可能性があることがわかる
↑と同様に失敗理由を伝えることができない
しかし抜け道が存在するもある
型検査は通ったはずなのに、nullが原因で実行時エラーが起きるパターン
TS
anyを使って型付けをした
間違った型を書いた
型検査は通るが、実際に入るデータはnullbaleであり、落ちるみたいな
これは実行時には型検査されないTS特有なのか #?? Rustなど強めの型検査があり、実行時にも?なんかする?言語ではどうなんだろう
キャスト
strict: trueにしてないと、nullableのときに怒ってくれない
nullableを快適に使うための言語の仕組み ref type guardとか
Monad
hsのMaybeはそもそもnullじゃないので別な気もするけどmrsekut.icon
誤用するぐらいならnullのほうが良い場合がある
適当に?? 0や?? ""とすると、DBに誤った値が入ることがある
JavaにはNullableとかNonNullアノテーションというのがあるらしい
関連
参考
Javaの話