オブジェクト指向とNullpointer Exception

こんにちははてなに入社しました321です、という嘘をエイプリルフールにやろうと思ったけど弊社(はてなではない)が大変なことになっててそれどころじゃなかったのでやめました。来年こそ入社します。

 

別に大変なことにはなってるのでそれどころじゃないのですが、javaの話をさせてください。一つ言っておくとエッセイであって技術書の類ではないです。

 javaに限った話ではないと思いますが、javaといえばオブジェクト指向、みたいな節あると思います。というか自然に記述するとオブジェクト指向になっちゃうと思うのですが、現実そうはいかない。

 単に能力が低いとか、他のフレームワークとの兼ね合いとかまあ色々あってオブジェクト指向ライクでない構成になってしまう。

 

 今回はそういう政治的な話ではなく単純な話をします。

 オブジェクト指向は簡単に言うと、どういう情報を保持していて、それをどのように扱うかを同じ場所に書こうよ。という話です。

 余りにも普通のことなので普通にやると実現してしまうのですが諸般の理由で出来ないことがあります。

そのうちの一つがNullpointerExceptionです。

オブジェクト指向だと

オブジェクト.メソッド()

と言う形で記述されるかと思います。

オブジェクトが保持している情報をオブジェクトに属したメソッドを用いて処理をするというごく普通の処理なんですが、問題があります。それはNull pointer exceptionが出るという問題です。

問題なのはNullなのに処理が継続されてることでは?それはそうだが……

ただ処理を継続させてしまうアホは次のように考えます。

 

オブジェクト.メソッド()

を呼ぶ前にNullチェックすればいいのでは?

 

if(オブジェクト!=Null)オブジェクト.メソッド

 

オブジェクトがNullの時の処理がないやん、それはそうだがアホなんで……

こうしてアホな状態を拡大させると全ての場所でNullチェックする羽目になります

するとアホはこう考えました

いろんなところで同じ処理がなされているので共通化したい

ただオブジェクトがNullだから落ちてるのでオブジェクトの中に書くわけにはいきません。切羽詰まったアホはこう書きます

ユーティリティクラス.メソッド(データ)

ユーティリティクラスにメソッドを書いておいてそこにデータを流し込みます。

これならユーティリティクラスはスタティックでいいのでNullになることはありません。データの中身もメソッド内でNullチェックすれば良くなりました。

 

 

良かったですね。レストインピース、オブジェクト指向プログラミング。

 

どうしたらよかったのか

まずNullチェックやめろ。必要になってる時点でバグだろ

初期化時点でNullセットするのやめろ

処理に失敗したらNull返すのやめろ!

なんかこう、optionalとかあるだろ!知らんけど