Item 54 nullではなく、空の集合または配列を返します.
9462 ワード
以下は周囲でよく見られる方法です.
コード54-1のセットが空の場合nullを返します.勉強しないで!
クライアントは、nullの状況を処理するために追加のコードを生成する必要があります.
クライアントから防御コードを削除するとエラーが発生する可能性があります.実際、ゼロのオブジェクトがほとんど存在しない場合、数年後にエラーが発生します.
一方nullを返す場合、返す側もこの場合を特別に処理すると、コードがより複雑になります.
####nullを返す言い方は間違っています
パフォーマンス分析の結果、この割り当てがパフォーマンスの低下の原因であると判断しない限り、この程度のパフォーマンスの違いは注目に値しません.
空のコレクションと配列は、再割り当てなしで返却できます.
戻りコード54-2の空のセットの正しい例
毎回同じ空の[不変](不変)コレクションが返されます.
リスト:Collections.emptyList
コレクション:Collections.emptySet
地図:Collections.emptyMap
コード54−3最適化−空のセットが再割り当てされるたびに回避される.
長さが0のコード54-4配列を返す正しい方法
長さ0の配列は変わらないからです.
コード54-5最適化-空の配列を再割り当てするたびに回避します.
したがって、cheesInStockが空の場合、EMPTY CHEESE ARRAYは常に返されます.
予め割り当てられたコード54−6の悪い例−配列は、パフォーマンスを低下させる. nullではなく、空の配列または集合を返します. nullを返すAPIは使いにくく,エラー処理コードも増加する.しかし、これはパフォーマンスが良好であることを意味するものではありません.
コード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を返す言い方は間違っています
パフォーマンス分析の結果、この割り当てがパフォーマンスの低下の原因であると判断しない限り、この程度のパフォーマンスの違いは注目に値しません.
空のコレクションと配列は、再割り当てなしで返却できます.
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()]);
コアの整理
Reference
この問題について(Item 54 nullではなく、空の集合または配列を返します.), 我々は、より多くの情報をここで見つけました https://velog.io/@wlghsp/Item-54-null이-아닌-빈-컬렉션이나-배열을-반환하라テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol