Мои Конспекты
Главная | Обратная связь


Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

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



 

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

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, а не массив нулевой длины. Такая идиома, по-видимому, проистекает из языка программирования С, где длина массива возвра­щается отдельно от самого массива. В языке С бесполезно выделять память под массив нулевой длины.

 




Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.