JavaRush /Java Blog /Random-TW /傳回一個零長度數組,不為 null
alexnjc
等級 31

傳回一個零長度數組,不為 null

在 Random-TW 群組發布
通常有類似這樣的方法:
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.");
對於幾乎每個傳回 null 而不是零長度數組的方法呼叫來說,這種詳細程度都是必要的。這充滿了錯誤,因為客戶端開發人員可能沒有編寫特殊程式碼來處理結果null。該錯誤可能多年都未被檢測到,因為此類方法通常會傳回一個或多個物件。還應該提到的是,返回null而不是數組會導致返回數組的方法本身變得複雜。有時有人認為傳回 null 比傳回零長度數組更好,因為它避免了在記憶體中分配數組的費用。這個論點失敗有兩個原因。首先,除非程式分析顯示此特定方法是效能下降的主要原因,否則擔心此等級的效能是沒有意義的。其次,每次呼叫不傳回記錄的方法都可以將相同的零長度數組傳遞給客戶端,因為任何零長度數組都是不可變的,並且不可變的物件可以共用。事實上,這正是當您使用標準習慣用法將集合中的元素轉儲到類型控制數組中時發生的情況:
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АУ);
}
在這個習慣用法中,一個常數作為零長度數組toArray被傳遞給一個方法來指示它應該回傳什麼類型。通常,此方法toArray為傳回的陣列分配記憶體空間,但如果集合為空,則將其放置在輸入陣列中,並且規格Сollесtion,tоАггау(Оbjесt[])確保如果輸入陣列足夠大以包含該集合,則這就是傳回的內容。因此,所提出的習慣用法本身永遠不會將零長度數組分配到記憶體中,而是使用「特定於類型的常數」。我們來總結一下。數組方法沒有理由傳回 null 而不是零長度數組。這個習慣用法似乎源自於 C 程式語言,其中陣列的長度與陣列本身分開傳回。在C中,為零長度數組分配記憶體是沒有用的。資料來源:Joshua Bloch,《Java TM 有效編程》,Lori 出版社
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION