次のシグネチャを持つ関数があるとします。
Foo[] getSomeFoos()
{
//return null --- option A
or
//return new Foo[0]; --- option B
}
要素が返されないことを示す値を返すための推奨される方法は何ですか?各オプションの長所または短所はありますか?
次のシグネチャを持つ関数があるとします。
Foo[] getSomeFoos()
{
//return null --- option A
or
//return new Foo[0]; --- option B
}
要素が返されないことを示す値を返すための推奨される方法は何ですか?各オプションの長所または短所はありますか?
メソッドGetSomeFoos()
が実際に'0個の要素を見つけた場合は、を返す必要がありnew Foo[0]
ます。
なんらかのエラーが発生した場合は、をスローする必要がありますException
。
その理由は、ユーザーがnullを探す必要がないためです。
for (Foo f: GetSomeFoos()) {
// do stuff
}
上記の場合、がGetSomeFoos
返された場合null
、ユーザーはを処理する必要がありNullPointerException
ます。ただし、空の配列を返すと、コードがループに入ることはなく、ユーザーは例外を処理する必要がありません。
新しい配列またはコレクションオブジェクトを作成するオーバーヘッドを回避できるため、nullを返す方が効率的です。関数の出力を使用するポイントでnullチェックを追加する必要があるのは事実ですが、そのオーバーヘッド(Javaおよびほとんどすべての言語)はごくわずかです。また、特にサードパーティのライブラリを扱う場合は、nullをチェックすることをお勧めします。
欠点は、コードをより冗長にすることです。
空の配列を返す場合は、同じオブジェクトを再利用することでパフォーマンスへの影響を軽減できます。不変の定数を作成し、それを返します。
private static final String[] EMPTY = {};
または:
private static final List<String> EMPTY =
Collections.unmodifiableList(new ArrayList<String>());
nullまたは空のオブジェクトを返すかどうかは、メソッドの使用法に完全に依存します。このメソッドがクライアントによって呼び出され、APIとして公開されている場合は、例外をスローする方が適切ですが、urパッケージ内で使用され、クライアントによって使用されていない場合は、nullを返すことは問題ありません。
私はゼロサイズの配列を好みます。
より安全(NPEを回避)およびより簡単(ヌルチェックは不要)です。
効果的なJava (第2版)から-項目43:nullではなく空の配列またはコレクションを返す
要約すると、空の配列またはコレクションを返す代わりに、配列値またはコレクション値のメソッドからnullを返す理由はありません。