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
失敗の場合として使用するのではなく、単純な値の欠如として使用してください。