2009-06-24 3 views

ответ

43

Пример. Скажем, у вас есть функция

public String[] getFileNames(String criteria) { 

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

Вариант с 0 размера массива лучше, потому что ваш абонент не нужно проверять NULL и может обрабатывать массив в единообразной форме - скажем, в цикле (который будет пустым в Это дело).

Там в главе об этом в Effective Java, Item 27

+0

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

15

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

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

for (String file : getFiles()) 

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

4

это замена нуль, так как вам не нужно, чтобы проверить нуль, прежде чем использовать его. Формально это особый случай special case design pattern (также проверьте нулевой объект).

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

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

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

Смежные вопросы