Javaの配列の長さは固定されています。では、なぜJavaはサイズ0の配列を許可するのですか?
String[] strings = new String[0];
回答:
Javaがサイズ1の配列を許可するのはなぜですか?単一の値を配列でラップするのはかなり役に立たないのではないですか?Javaがサイズ2以上の配列のみを許可するのであれば十分ではないでしょうか?
はい、null
空の配列の代わりに渡すことができ、サイズ1の行列の代わりに単一のオブジェクトまたはプリミティブを渡すことができます。
しかし、そのような制限に反対するいくつかの良い議論があります。私の個人的なトップの議論:
制限が複雑すぎて、実際には必要ありません
配列をサイズ[1..INTEGER.MAX_INT]に制限するには、コードに多くの追加の境界チェック(Konradsのコメントに同意)変換ロジックとメソッドのオーバーロードを追加する必要があります。許可されたアレイサイズから0(およびおそらく1)を除外しても、コストを節約できず、追加の作業が必要になり、パフォーマンスに悪影響を及ぼします。
配列モデルベクトル
配列は、ベクターのための優れたデータモデルである(数学、ないVector
クラス!)。そしてもちろん、数学のベクトルはゼロ次元である可能性があります。これは、存在しないこととは概念的に異なります。
補足-(char-)配列の主要なラッパーはString
クラスです。不変String
は空の配列の概念を具体化します:それは空の文字列(""
)です。
>= 0
するだけ> 0
です)。しかし、もちろん残りの部分については正しいので、この制限を追加しても意味がありません。
これを考慮してください(正午の答えのより詳細な説明):
public String[] getStrings() {
if( foo ) {
return null;
} else {
return new String[] {"bar, "baz"};
}
}
String[] strings = getStrings();
if (strings != null) {
for (String s : strings) {
blah(s);
}
}
今それをこれと比較してください:
public String[] getStrings() {
if( foo ) {
return new String[0];
} else {
return new String[] {"bar, "baz"};
}
}
// the if block is not necessary anymore
String[] strings = getStrings();
for (String s : strings) {
blah(s);
}
これ(null値ではなく空の配列を返す)は、実際にはJavaAPI設計の世界でのベストプラクティスです。
さらに、Javaでは、リスト(ArrayListなど)を配列に変換できます。空のリストを空の配列に変換することだけが意味があります。
空の配列が非常に役立つと思う1つのケースは、nullが許可されていない状況でnullの代わりにそれを使用することです。その1つの可能な例は、配列のBlockingQueueです。入力の終了を読み取り側に通知したい場合はどうしますか?nullを送信するのは当然の選択のように思えますが、BlockingQueueはnullを受け入れないということです。配列を " boolean last;
"のようなフィールドでクラス内にラップすることもできますが、それは一種のやり過ぎです。空の(サイズがゼロの)配列を送信するのが最も合理的な選択のようです。
test(Object... objects)
がある場合に明示的に関数を呼び出す場合にも役立ちますtest()