ничего не вернуть, используя array == null или array.length == 0?

Предположим, у меня есть функция со следующей подписью:

Foo[] getSomeFoos() 
{
      //return null         --- option A 
      or 
      //return new Foo[0];  --- option B
}

Какова рекомендуемая практика для возврата значения, указывающего на отсутствие возвращенных элементов? Есть ли плюсы или минусы для каждого варианта?


person pierrotlefou    schedule 28.09.2010    source источник
comment
См. [Является ли возврат null плохим дизайном? ] (stackoverflow.com/questions/1274792/)   -  person Matthew Flaschen    schedule 28.09.2010


Ответы (5)


Если ваш метод GetSomeFoos() действительно «нашел» 0 элементов, он должен вернуть new Foo[0].

Если произошла какая-то ошибка, вы должны выбросить Exception.

Причина в том, что пользователям не нужно искать нули:

for (Foo f: GetSomeFoos()) {
    // do stuff
}

В приведенном выше случае, если GetSomeFoos вернул null, пользователю придется иметь дело с NullPointerException. Но если вы вернете пустой массив, код никогда не войдет в цикл, и пользователю не придется иметь дело с исключением.

person jjnguy    schedule 28.09.2010
comment
return null может быть разумным. Я бы сказал, что не существует типа Foo, который можно было бы вернуть. Во всех остальных случаях разумнее всего возвращать пустой массив. - person Joshua; 28.09.2010
comment
@ Джошуа, полагаю, я мог придумать причину, по которой я мог вернуть null. Но обычно я возвращаю пустой список / массив. - person jjnguy; 28.09.2010
comment
Возврат нулевого или пустого объекта полностью зависит от использования метода. Если этот метод вызывается клиентом и отображается как API, то лучше генерировать исключение, но если он используется в пакете ur и никогда не используется клиентом, тогда возврат null - это нормально. - person Dead Programmer; 28.09.2010

Возврат нулевого или пустого объекта полностью зависит от использования метода. Если этот метод вызывается клиентом и отображается как API, то лучше генерировать исключение, но если он используется в пакете ur и никогда не используется клиентом, тогда возврат null - это нормально.

person Dead Programmer    schedule 28.09.2010

Возврат null более эффективен, поскольку вы избегаете накладных расходов на создание нового массива или объекта коллекции. Верно, что затем вам нужно добавить нулевую проверку в точке, где вы используете вывод функции, но накладные расходы для этого (в Java и почти на всех языках) незначительны. Я также считаю, что проверка на null - это хорошая привычка, особенно при работе со сторонними библиотеками.

Обратной стороной является то, что вы делаете код более подробным.

Если вы вернете пустой массив, вы можете уменьшить снижение производительности, повторно используя тот же объект. Создайте неизменяемую константу и верните ее:

private static final String[] EMPTY = {};

Or:

private static final List<String> EMPTY = 
    Collections.unmodifiableList(new ArrayList<String>());
person Mike Baranczak    schedule 28.09.2010
comment
Вы оспариваете прирост производительности между: return null и return new Object[0]? Я не могу поверить, что выделение 0 места занимает намного больше времени, чем его отсутствие. (Подождите, а есть разница?) - person jjnguy; 28.09.2010
comment
Преждевременная оптимизация - корень всех зол. Не возвращайте null, конечно, не по этой причине. - person Carl Manaster; 28.09.2010
comment
Есть большая разница. Массив Java - это объект, а не C, где массив - это просто указатель на выделенный блок в куче. Вам необходимо выделить место для объекта массива и инициализировать его, даже если он имеет нулевые элементы. - person Mike Baranczak; 28.09.2010
comment
С помощью escape-анализа массив фиксированного размера может быть выделен стеком, что более или менее бесполезно. Если вы ожидаете, что ссылка будет часто ускользать (и вы можете доказать, что выделения являются проблемой), вы можете сохранить массив с нулевым элементом в статическом конечном поле и возвращать тот же объект каждый раз, когда вы обнаруживаете нулевые совпадения. - person gustafc; 28.09.2010

Я предпочитаю массив нулевого размера.

Это безопаснее (избегайте NPE) и проще (не требуется нулевая проверка).

person 卢声远 Shengyuan Lu    schedule 28.09.2010

Из Эффективная Java (2-е издание) - пункт 43 : возвращать пустые массивы или коллекции, но не нули

Таким образом, нет причин когда-либо возвращать null из метода, возвращающего массив или коллекцию, вместо того, чтобы возвращать пустой массив или коллекцию

person barrowc    schedule 28.09.2010