3

次のシグネチャを持つ関数があるとします。

Foo[] getSomeFoos() 
{
      //return null         --- option A 
      or 
      //return new Foo[0];  --- option B
}

要素が返されないことを示す値を返すための推奨される方法は何ですか?各オプションの長所または短所はありますか?

4

5 に答える 5

11

メソッドGetSomeFoos()が実際に'0個の要素を見つけた場合は、を返す必要がありnew Foo[0]ます。

なんらかのエラーが発生した場合は、をスローする必要がありますException

その理由は、ユーザーがnullを探す必要がないためです。

for (Foo f: GetSomeFoos()) {
    // do stuff
}

上記の場合、がGetSomeFoos返された場合null、ユーザーはを処理する必要がありNullPointerExceptionます。ただし、空の配列を返すと、コードがループに入ることはなく、ユーザーは例外を処理する必要がありません。

于 2010-09-28T03:14:21.393 に答える
0

新しい配列またはコレクションオブジェクトを作成するオーバーヘッドを回避できるため、nullを返す方が効率的です。関数の出力を使用するポイントでnullチェックを追加する必要があるのは事実ですが、そのオーバーヘッド(Javaおよびほとんどすべての言語)はごくわずかです。また、特にサードパーティのライブラリを扱う場合は、nullをチェックすることをお勧めします。

欠点は、コードをより冗長にすることです。

空の配列を返す場合は、同じオブジェクトを再利用することでパフォーマンスへの影響を軽減できます。不変の定数を作成し、それを返します。

private static final String[] EMPTY = {};

または:

private static final List<String> EMPTY = 
    Collections.unmodifiableList(new ArrayList<String>());
于 2010-09-28T04:31:22.177 に答える
0

nullまたは空のオブジェクトを返すかどうかは、メソッドの使用法に完全に依存します。このメソッドがクライアントによって呼び出され、APIとして公開されている場合は、例外をスローする方が適切ですが、urパッケージ内で使用され、クライアントによって使用されていない場合は、nullを返すことは問題ありません。

于 2010-09-28T03:24:19.663 に答える
0

私はゼロサイズの配列を好みます。

より安全(NPEを回避)およびより簡単(ヌルチェックは不要)です。

于 2010-09-28T05:13:57.727 に答える
0

効果的なJava (第2版)から-項目43:nullではなく空の配列またはコレクションを返す

要約すると、空の配列またはコレクションを返す代わりに、配列値またはコレクション値のメソッドからnullを返す理由はありません。

于 2010-09-28T14:10:31.333 に答える