Javaはnullではなくゼロ長配列または集合を返します.

1689 ワード

次の方法は珍しくありません.
private final list cheesesInStock = ...;
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
...
}
これにより、クライアント呼び出しでnullを処理する必要がある場合.
Cheese[] cheeses = shop.getCheeses();
if(cheeses != null && Arrays.asList(cheeses).contains(Cheese.STILTON))
System.out.println("Jolly good, just the thing.");
ではなく
if(Arrays.asList(cheeses).contains(Cheese.STILTON))
System.out.println("Jolly good, just the thing.");
これにより、クライアントのコードがより煩雑になり、nullの判断を忘れるプログラマーもいるかもしれません.
正しい方法は、ゼロ長の配列または集合を返すことです.
private final List cheesesInStock = ...;
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];//ゼロ長配列、可変なし!
//配列を返す
public Cheese[] getCheeses() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
//集合に戻る
public List getCheeseList() {
if(cheeseInStock.isEmpty() ) {
return Collections.emptyList();//常に同じリストを返す
}
else {
return new ArrayList(cheeseInStock);
}
}
ゼロ長配列の定義:
		int[] zeroArray = new int[0];
		System.out.println(zeroArray.length); // 0

ゼロ長の配列が可変ではないので(そうするわけにはいかないでしょう.zeroArray[0]=8、配列長が0なのに、zeroArray[0]の存在があるはずがないでしょう)
したがって、ゼロ長配列は、クラスの共有(またはプライベート)静的finalドメイン(参照可変)として使用することができる.
したがって、コストを節約するためにprivate static final int EMPTY_を設定することができます.ARRAY = new int[0];
クラスのメソッドでは、戻り配列が0の場合、その配列が返されます.(何個返されても同じゼロ長配列を指します)
ゼロ長の集合を返すには、集合フレームワークのツールクラスCollections(sあり)のemptyList()メソッドを使用するか、共有静的finalドメインEMPTY_を直接使用します.LIST.
要するに、メソッドは、タイプが集合または配列のnullではなく、ゼロ長の配列または集合を返すことが望ましい.
[参照Effective Java Second Edition]-Item 43