Главная » Java, Советы » Возвращайте массив нулевой длины, а не null

0

 

Нередко встречаются методы, имеющие следующий вид:

private List cheesesInStock = … ;

/**

* @return массив, содержащий все сыры, имеющиеся в магазине,

* или 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.");

 

Такого рода многоречивость необходима почти при каждом вызове метода, который BM~CTO массива нулевой длины возвращает null. Это чревато ошибками, так как разработчик клиента мог и не написать специальный код для обработки результата null. Ошибка может оставаться незамеченной годами, поскольку подобные методы, как правило, возвращают один или несколько объектов. Следует еще упомянуть о том, что возврат null вместо массива приводит к усложнению самого метода, возвращающего массив.

Иногда можно услышать возражения, что возврат значения null предпочтительнее возврата массива нулевой длины потому, что это позволяет избежать расходов на размещение массива в памяти. Этот аргумент несостоятелен по двум причинам. Во-первых, на этом уровне нет смысла беспокоиться о производительности, если только профилирование программы не покажет, что именно этот метод является основной причиной падения производительности (статья 37). Во-вторых, при каждом вызове метода, который не возвращает записей, клиенту можно передавать один и тот же массив нулевой длины, поскольку любой массив нулевой длины неизменяем, а неизменяемые объекты доступны для совместного использования (статья 13). На самом деле, именно это и происходит, когда вы применяете стандартную идиому для выгрузки элементов из коллекции в массив с контролем типа:

 

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оАггау(ОЬjесt[] дает гарантию, что если входной’ массив будет достаточно вместителен, чтобы содержать коллекцию, возвращен будет именно он. Поэтому представленная идиома никогда не будет сама размещать в памяти массив нулевой длины, а в качестве такового использует "константу с указанием типа".

Подведем итоги. Нет никаких причин для того, чтобы работающий с массивами метод возвращал значение null, а не массив нулевой длины. Такая идиома, по-видимому, проистекает из языка программирования С, где длина массива возвращается отдельно от самого массива. В языке С бесполезно выделять память под массив нулевой длины.

 

Источник: Джошуа Блох, Java TM Эффективное программирование, Издательство «Лори»

По теме:

  • Комментарии