新規広告開発部の松本です。クックパッドiOS/Androidアプリの広告の開発に携わっています。null)といったnullチェックを行おうとしていました。これに対し、先日の社内コードレビューでとてもためになるアドバイスをもらいました。私のようなAndroid初心者にとってnullに対する考え方の基礎を作ってくれるレビューだったので、本稿で共有したいと思います。AndroidやJava開発に慣れた方にとっては「今更そんな話か」といった内容かと思いますが、クックパッドでのレビューの一例としてご覧いただければ幸いです。やりがちなnullチェックあるとき、「Androidではクラッシュしないことが大事であり、そのためにnullチェックは基本!」という考えのもと、以下のようなコードを至るところに書きました。foo.bar();}するとコードレビューでこんなコメントをもらいました。一般に、過剰なエラーチェックは混乱を招くのでよくないし、内部状態が壊れているのになんとなく動いてしまうというのは結果が予測できず、クラッシュより深刻なバグになる可能性があるのでよくないです。今まで考えていた事とは逆ですが、確かにレビュアーの言うとおりです。歪な修正は根本的な原因を隠す*1ことに繋がるのですね。そんな疑問が浮かんだ頃、こんなアドバイスをもらいました。IllegalStateExceptionでクラッシュさせる。catch文やCrashlyticsを使う基準までまとめてもらいました。「敢えてクラッシュする可能性を残す」ことも時には必要なんですね。@Nullableと@NonNullまたあるとき、こんなコードを書きました。}}これに対し、こんなレビューをもらいました。annotationがほしいすね。nullがくるのが仕様なのかそうでないか知りたい。注釈しつつnullがきたらIllegalArgumentException投げるみたいなのでもいいんですよ。19.1からサポートしているようです*2。値を渡そうとするとIDEが警告出してくれたりするんですよ!まあ、警告はかならず出してくれるわけではないので、documentの意味合いのほうが強いですけど。どの変数やフィールドにつけてもそれなりに効果はありますが、一番効果がある(ゆえに優先度が高い)のは公開インターフェイス部分です。みたいにすると警告が出るのでわかりやすい。いえとりあえずは引数だけつけるのがおすすめです。0.5.5から@Nullable/@NonNull対応、すなわち警告を出してくれるようですね*3。引数に@NonNullを指定するのはとても便利ですね。ライブラリやSDKを作る際に、「この引数はnull禁止!」ということを明示的に示すことで想定外の使われ方が減りそうです。以上のアドバイスを元に以下のコードを修正してみましょう。}}コード中のengine変数はnullを許容できないので、CarMakerクラスの利用者にその旨を通知したいとします。そこで、engine変数は@NonNullであることをメソッドの引数で宣言します。}}checkEngine()メソッド内のnullチェックがなくなりスッキリし、可読性が上がりました。engineはnullを受け入れないことが明示的に宣言されたので、アノテーション対応のIDE*4を使用した際に警告が表示されるようになりました。実はこのnullの扱い、そう単純に割り切れないようです。いくつか考慮すべき点があります。どこまで@NonNullを付けるか上の例では各メソッドの引数にのみ@NonNullを付けました。Carクラスのengineメンバなどにも@NonNullを付けることは可能です。厳格に考えればCarのメンバであるengineにも@NonNullを付加すべきでしょう。理由は以下のとおりです。緩く考えれば、@NonNullを付加するのはmake()メソッドだけで十分でしょう。理由は以下の通りです。}}何の例外を投げるかこれまでの例では明示的に例外を投げていないので、NullPointerExceptionが発生します。「引数が不正なのだからIllegalArgumentExceptionを投げるべきだ」と考える事もできます。その場合、コードは以下のようになるでしょう。@NonNullは一切付加せず、engineに対してnullチェックをしています。}}どこまで使用者を信頼するか「どこまで@NonNullを付けるか」と「何の例外を投げるか」、以上の2つは「どこまでクラス使用者(今回はCarMaker使用者)を信頼するか」に依るところもあるようです。CarMakerを使うのは自分だけであれば、make()メソッドの引数に@NonNullを付加してnullを与えないよう気をつけるだけでよいでしょう。CarMakerをライブラリとして公開し不特定多数の人が使用するのであれば、make()メソッドの引数で@NonNullを付加し注意を促した上で、Carクラス内でIllegalArgumentExceptionを投げることもあるでしょう。}}まとめ本稿では、Android開発において私自身が受けたレビューを元に、nullの扱いについてお話しました。簡単ながら、知れば知るほど奥が深く、私も引き続き勉強したいと思います*5。私と同じく最近Android開発を始めた方のお役に少しでも立てば幸いです。2019夏メディアプロダクト開発部の安部(@STAR_ZERO)です。A...2018-04-18ReactNativeプロジェクトのAndroid環境を整備する投稿開発部の吉田です。現在自分が...2015-03-20新米Android開発者が見落としがちな3つのポイントこんにちは、投稿推進部の吉田(@101kaz)です。使ったセキュリティログ検索基盤の構築サービス特性にあった検索システムの設計戦略クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。/*}*/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。