Part30: Null安全性

ことり「ぬるぽ」
凛「ガッ!」
ことり「最近こういうこと言うと、インターネット老人会扱いされるみたいだよ」
凛「ええ~、そんな昔とは思えないにゃ~」


ことり「nullに関する問題は、プログラミングの世界では昔からあるものです。JavaだとNullPointerExceptionだけど、他にもいろんな言語でいろんなバグの原因になってるの」
凛「ポインタってC言語の用語だと思ってたにゃ」
ことり「ポインタって言葉を使うか使わないかはともかく、値の存在しないものに対して処理をしようとするとおかしくなるのはどんな言語も同じだよね」
凛「なるほど、そういう概念のことなんだね」

ことり「Kotlinにもnullってキーワードはあります。だけど、どんな変数にも入れられるわけじゃないの」

ことり「たとえばString型の変数にはnullは代入できません。だけど、String?とすると代入できます」
凛「何が違うの?」
ことり「?がついた型はNULL許容型みたいな呼び方をするんだけど、通常の型と違って値としてnullを持つことができます。言い換えると、普通の型はnullにはならないの」
凛「じゃ、null使いたかったらNULL許容型を使えばいいんだ」
ことり「そうなんだけど、本当に必要なところ以外はお勧めしないかな」

ことり「こんなふうに、str2に対してはそのままではプロパティへのアクセスができません。nullかもしれないから」
凛「むむむ」
ことり「これを回避するにはいくつか方法があって、1つは明示的なnullチェックです」

ことり「こんなふうに事前にチェックされていれば、変数が変更されない範囲においてプロパティへのアクセスができます。この辺はスマートキャストと似てるね」
凛「言語仕様レベルで手抜きができなくなってるにゃ」

ことり「安全な呼び出し演算子っていうのもあって、さっきのコードでstr?.lengthって書き方をすると未チェックでもプロパティを参照できます」
凛「これ、nullだったらどうなるの?」
ことり「結果がnullになります。本来lengthの戻り値はIntだけど、この場合はInt?になります」
凛「戻り値をNULL許容型にしてnullを返すんだね。問題の先送りに使えるにゃ」
ことり「・・・間違ってはいないけど、その表現はちょっと・・・」

ことり「エルビス演算子っていうのもあってね」
凛「プレスリー?」
ことり「そう、プレスリー」
凛「プレスリー」
ことり「var l = str.length ?: -1って書くと、strnullでなければ文字列の長さが、nullだったら-1が得られます」
凛「あ、?:がエルビス・プレスリーの顔にゃ!」
ことり「そういうこと。形から名前のつく演算子、たまにあるよね。C++のスペースシップ演算子<=>とか」
凛「(・8・)
ことり「演算子にマルチバイト文字は、ちょっと・・・」

ことり「最後は、潔くNullPointerExceptionを投げる方法です。str!!.lengthって書くと、strnullだったらNullPointerExceptionが発生します」
凛「あんまり推奨されないのが目に見えてるにゃ」
ことり「うん。Kotlinの思想はNULL参照を排除することだから、NullPointerExceptionは本来発生すべきでないの」


凛「書き方はいろいろ面倒な代わりに安全なコードが書けそうなのは分かったにゃ」
ことり「コードの規模が大きくなると、むしろ楽に書けるんだよ」
凛「でもこれでぬるぽ文化が消えるのは・・・」
ことり「ガッ!」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です