Item 54 nullではなく、空の集合または配列を返します.

9462 ワード

以下は周囲でよく見られる方法です.
コード54-1のセットが空の場合nullを返します.勉強しないで!
private final List<Cheese> cheeseInStock = ...;

/**
 * @return 매장 안의 모든 치즈 목록을 반환한다. 
 *      단, 재고가 하나도 없다면 null을 반환한다.
 */
public List<Cheese> getCheeses() {
    return cheeseInStock.isEmpty() ? null : new ArrayList<>(cheeseInStock) ;
}
実は在庫がなくても特別に処理する理由はありません.このコードのようにnullを返すと、
クライアントは、nullの状況を処理するために追加のコードを生成する必要があります.
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && cheeses.contains(Cheese.STILTON))
    System.out.println("좋았어, 바로 그거야.");
コンテナ(コレクションや配列など)が空の場合、nullを返す方法を使用する場合は、常にこれと同じ防御コードを追加する必要があります.
クライアントから防御コードを削除するとエラーが発生する可能性があります.実際、ゼロのオブジェクトがほとんど存在しない場合、数年後にエラーが発生します.
一方nullを返す場合、返す側もこの場合を特別に処理すると、コードがより複雑になります.
####nullを返す言い方は間違っています

  • パフォーマンス分析の結果、この割り当てがパフォーマンスの低下の原因であると判断しない限り、この程度のパフォーマンスの違いは注目に値しません.

  • 空のコレクションと配列は、再割り当てなしで返却できます.
  • 戻りコード54-2の空のセットの正しい例
    public List<Cheese> getCheeses() {
        return new ArrayList<>(cheesesInStock);
    }
    使用中に複数のランダムセットを割り当てるとパフォーマンスが著しく低下するため、解決策は以下のとおりです.
    毎回同じ空の[不変](不変)コレクションが返されます.
    リスト:Collections.emptyList
    コレクション:Collections.emptySet
    地図:Collections.emptyMap
    コード54−3最適化−空のセットが再割り当てされるたびに回避される.
    public List<Cheese> getCheeses() {
        return cheeseInStock.isEmpty() Collections.emptyList() : new ArrayList<>(cheesesInStock);
    }
    配列も絶対nullではなく、長さが0の配列を返します.
    長さが0のコード54-4配列を返す正しい方法
    public List<Cheese> getCheeses() {
        return cheeseInStock.toArray(new Cheese[0]);
    }
    上記の方法でパフォーマンスが低下する可能性がある場合は、長さ0の配列を事前に宣言し、その配列を返すたびに返します.
    長さ0の配列は変わらないからです.
    コード54-5最適化-空の配列を再割り当てするたびに回避します.
    private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
    
    public Cheese[] getCheeses() {
        return cheeseInStock.toArray(EMPTY_CHEESE_ARRAY);
    }
    この最適化バージョンのgetCheeseは、常にEMPTY CHEESE ARRAYをパラメータとしてToArrayを呼び出します.
    したがって、cheesInStockが空の場合、EMPTY CHEESE ARRAYは常に返されます.
    予め割り当てられたコード54−6の悪い例−配列は、パフォーマンスを低下させる.
    return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]);

    コアの整理

  • nullではなく、空の配列または集合を返します.
  • nullを返すAPIは使いにくく,エラー処理コードも増加する.しかし、これはパフォーマンスが良好であることを意味するものではありません.