Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Effective Java TM.doc
Скачиваний:
3
Добавлен:
28.09.2019
Размер:
2.11 Mб
Скачать

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

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

private List cheesesInStock = ... ;

/**

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

* или null, если сыров для продажи нет.

*/

public Cheese[] getCheeses() {

if (cheesesInStock.size() == 0)

return null;

}

125

Нет причин рассматривать как особый случай ситуацию, когда в продаже нет сыра. Это требует от клиента написания дополнительного кода для обработки возвра­щаемого методом значения п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 выделяет место в памяти для возвращаемого массива, однако если коллекция пуста,

126

она размещается во входном массиве, а спецификация Сollесtion,tоАггау(ОЬjесt[] дает гарантию, что если входной' массив будет достаточно вместителен, чтобы со­держать коллекцию, возвращен будет именно он. Поэтому представленная идиома никогда не будет сама размещать в памяти массив нулевой длины, а в качестве такового использует "константу с указанием типа".

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]