nullの代わりに空のコレクションまたは「空白」アクションを使用する主な利点は、ほとんどの場合、そのようなオブジェクトがさらに変更されることなくコードで機能することです。そのnull本質的な価値は、その性質上、エラーが発生しやすいということです。
たとえば、次のコードを考えてみましょう。
String[] names = data.getNames();
if (names != null) {
for (String name : names) {
// Do stuff
}
}
のチェックnullが必要です。そうでない場合は、NPEを取得します。標準のforループを使用しても、問題は解決しません。一方、常に何らかの配列を取得することがわかっている場合は、追加のチェックを行わなくてもコードは正常に機能します。配列が空の場合、ループはまったく実行されません。問題が解決しました。
何らかのアクションを実装するコードについても同じことが言えます。もう一つの例:
Action myAction = data.getActionToRun();
if (myAction != null) {
myAction.run();
}
もう一度、nullチェックが必要です。アクションが存在することが保証されている場合は、action.run()副作用なしでいつでも呼び出すことができますが、空白のアクションは何もしません。とても簡単です。
多くの場合、nullメソッドの戻り方法を変更すると、チェックを単純に破棄できるため、コードがはるかに単純で理解しやすくなります。デフォルトの「アクションレス」値がないため、場合によっては、戻るnullことが正しい選択です(たとえば、キーと値のコレクションからオブジェクトを取得する)。ただしnull、値がまったくないことを示しており、レシーバーとして追加の処理が必要です。空白のアクションのないnull以外のオブジェクトを使用すると、データオブジェクトでエラーを処理できます。それは良いカプセル化です。良いプログラミングです。それはうまくいきます。™</p>
最後に、戻るnullことは確かにエラーを処理するための良い方法ではありません。コードで問題が発生した場合、プログラマーがプログラミングの間違いを犯さない限り、問題が発生することはありません。sまたは例外を使用してassertください。それらは失敗です。null失敗の場合として使用するのではなく、単純な値の欠如として使用してください。