Использование массива нулевой длины

#java #arrays #multidimensional-array #declaration #indices

#java #массивы

Вопрос:

Например, мы можем построить такой массив следующим образом:

  new ElementType[0];
 

Я видел такую конструкцию, но я не понимаю, почему это может быть полезно.

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

1. Пожалуйста, отредактируйте свой вопрос, чтобы уточнить.

Ответ №1:

Пример. Допустим, у вас есть функция

 public String[] getFileNames(String criteria) {
 

чтобы получить некоторые имена файлов. Представьте, что вы не нашли ни одного имени файла, удовлетворяющего критериям. Что вы возвращаете? У вас есть 2 варианта — либо возвращать значение null, либо массив размером 0.

Вариант с массивом размером 0 лучше, потому что вашему вызывающему не нужно проверять наличие NULL и он может обрабатывать массив согласованным образом — скажем, в цикле (который в этом случае был бы пустым).

Об этом есть глава в Effective Java, пункт 27

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

1. Чтобы быть уверенным: если код предназначен для использования на «нижних уровнях», null он намного более производителен. Также см. 3-й абзац code.google.com/p/guava-libraries/wiki /…

Ответ №2:

С ним легче работать, чем null во многих случаях, где null есть очевидная альтернатива.

Предположим, вы хотите вернуть Iterable<String> файл, содержащий (скажем) список соответствующих имен файлов… но по какой-то причине их нет. Вы могли бы вернуться null , чтобы указать это, но тогда вызывающий должен использовать особый случай. Вместо этого, если вы возвращаете пустую коллекцию, вызывающий объект все равно может использовать расширенный цикл for:

 for (String file : getFiles())
 

Итак, зачем использовать пустой массив вместо пустого ArrayList или чего-то подобного? Массивы имеют фиксированный размер, поэтому пустой массив фактически неизменяем. Это означает, что вы можете сохранить единственное значение и вернуть его кому угодно, зная, что они ничего не смогут с ним сделать. Это может быть очень полезно в некоторых ситуациях.

Ответ №3:

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

Другое идиоматическое использование — collections toArray:

 List<String> list = new ... ;
// fill the list
String[] array = list.toArray(new String[0]); 
 

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

1. Обратите внимание, что во втором случае any String[] будет работать так же хорошо; ему просто нужен экземпляр типа, в который вы хотите его преобразовать.