JavaRush /Java Blog /Random-JA /null ではなく、長さ 0 の配列を返します
alexnjc
レベル 31

null ではなく、長さ 0 の配列を返します

Random-JA グループに公開済み
多くの場合、次のようなメソッドがあります。
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* or null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
チーズが売られていない状況を特別なケースとして扱う理由はありません。これには、クライアントがメソッドの戻り値を処理する追加のコードを記述する必要がありますпull。次に例を示します。
Cheese[] cheeses = shop.getCheeses();
if (cheeses ! = пull &&
Аrrауs.аsList(shор.gеtСhееsеs()).соntаins(Сhееsе.SТILТON))
Sуstеm.оut.рrintln("Jоllу good, just the thing.");
単純ではなく:
if  (Аrrаys.аsList(shор.gеtСhееsеs()).соntаins(Сhееsе.SТILTON)) Sуstеm.оut.рrintln("Jоllу good, just the thing.");
この種の冗長性は、長さ 0 の配列ではなく null を返すほとんどすべてのメソッド呼び出しに必要です。クライアント開発者が結果を処理するための特別なコードを書いていない可能性があるため、これにはエラーが伴いますnull。このようなメソッドは通常 1 つ以上のオブジェクトを返すため、エラーは何年も検出されない可能性があります。null配列の代わりに返すと、配列を返すメソッド自体が複雑になることにも注意してください。メモリ内に配列を割り当てるコストを回避できるため、長さ 0 の配列を返すよりも null を返す方が望ましいと主張されることがあります。この議論は 2 つの理由から失敗します。まず、プログラムのプロファイリングによって、この特定のメソッドがパフォーマンス低下の主な原因であることが示されない限り、このレベルのパフォーマンスについて心配する必要はありません。第 2 に、レコードを返さないメソッドの各呼び出しは、同じ長さ 0 の配列をクライアントに渡すことができます。これは、長さ 0 の配列は不変であり、不変オブジェクトは共有できるためです。実際、これはまさに、コレクションから型制御された配列に要素をダンプするための標準的なイディオムを使用したときに起こることです。
private List сhееsеsInStосk =,
private fiпаl static Cheese[] NULL_CHEESE_ARRAY = nеw Cheese[0];
 /**
* @геtuгп массие, содержащий все сыры, имеющиеся в магазине
*/
public Cheese[] getCheeses() {
геtuгп (Cheese[] сhееsеsInStосk.tоАггау(NULL_СНЕЕSЕ_АRRАУ);
}
このイディオムでは、定数が長さ 0 の配列toArrayとしてメソッドに渡され、返される型を示します。通常、メソッドはtoArray返された配列にメモリ領域を割り当てますが、コレクションが空の場合は入力配列に配置され、入力Сollесtion,tоАггау(Оbjесt[])配列がコレクションを含めるのに十分な大きさであれば、それが返されることが仕様によって保証されます。したがって、提示されたイディオム自体は長さ 0 の配列をメモリに割り当てることはなく、「型固有の定数」そのものを使用します。要約しましょう。配列メソッドが長さ 0 の配列ではなく null を返す理由はありません。このイディオムは、配列の長さが配列自体とは別に返される C プログラミング言語に由来しているようです。C では、長さ 0 の配列にメモリを割り当てることは役に立ちません。出典: Joshua Bloch、Java TM 効果的なプログラミング、Lori Publishing House
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION