JavaRush /Java 博客 /Random-ZH /返回一个零长度数组,不为 null
alexnjc
第 31 级

返回一个零长度数组,不为 null

已在 Random-ZH 群组中发布
通常有类似这样的方法:
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