ничего не возвращать, используя array == null или array.length == 0? - PullRequest
3 голосов
/ 28 сентября 2010

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

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

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

Ответы [ 5 ]

11 голосов
/ 28 сентября 2010

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

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

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

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

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

0 голосов
/ 28 сентября 2010

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

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

0 голосов
/ 28 сентября 2010

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

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

0 голосов
/ 28 сентября 2010

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

Недостатком является то, что вы делаете код более многословным.

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

private static final String[] EMPTY = {};

Или:

private static final List<String> EMPTY = 
    Collections.unmodifiableList(new ArrayList<String>());
0 голосов
/ 28 сентября 2010

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

...