Итератор нулевой коллекции
Довольно часто, что я должен проверять значение null перед повторением, если не уверен, что ссылка на сборку равна null или нет.
Пример:
Collection<Object> collection = ...
...
if(collection != null)//troublesome
for(Object o : collection)
Конечно, я знаю, что пустая коллекция намного лучше нуля, но в некоторых случаях клиентский код не может управлять обнуляемой коллекцией из других модулей (например, возвращаемое значение из стороннего кода).
Поэтому я написал метод утилиты:
public static <T> Iterable<T> nullableIterable(Iterable<T> it){
return it != null ? it : Collections.<T>emptySet();
}
В коде клиента нет необходимости проверять нуль:
for(Object o : nullableIterable(collection))
...
Считаете ли вы, что nullableIterable()
разумно? Любой совет? Любые проблемы? Спасибо!
Ответы
Ответ 1
Это выглядит хорошо. Я лично это тоже делаю. Вы всегда получите разработчиков, которые не согласятся с этим, поскольку это своего рода защитное программирование. Представьте, что у вас есть рабочий процесс или класс, который не должен возвращать null
. Это означает, что получение null
из него - это ошибка, которую ваш код скроет, так как он превратит null
в пустую коллекцию, и ошибка никогда не появится.
Если вы, например, пишете API, которые не поддерживают коллекции null
, вам следует избегать этого. Если код клиента дает вам коллекцию null
, в которой вы ее не поддерживаете, вы должны бросить IllegalArgumentException
, чтобы клиентский код знал, что с предоставленной коллекцией что-то не так. Что-то вроде:
public void myApiNoSupportForNull(Collection<Object> collection){
// Pre condition
if(collection == null)
throw new IllegalArgumentException("This API does not support null collections!");
//...
}
Ответ 2
Это выглядит хорошо для меня, если вы ограничиваете использование этой функции слоем, который взаимодействует с "внешним" кодом, и убедитесь, что вы никогда не начнете использовать его для защиты от себя или от своих коллег.
Рассмотрите аннотатные параметры и поля в вашем коде с помощью @Nullable аннотации - если предположить, что то, что не аннотируется, не может быть нулевым, очень полезно, особенно принимая во внимание, что средства IDE и средства статического анализа знают об этой аннотации.
Ответ 3
В большинстве случаев это было бы нормально.
Не забывайте, что вы можете столкнуться с третьими сторонами, которые возвращают null в случае ошибки и что пустой список является допустимым результатом.
Поэтому я хотел бы немного изменить ваш код и сделать что-то вроде этого:
public static <T> Iterable<T> nullableIterable(Iterable<T> it, boolean exceptionIfNull){
if (exceptionIfNull && it == null) {
throw new NUllPointerException("Iterable is null");
} else
return it != null ? it : Collections.<T>emptySet();
}
public static <T> Iterable<T> nullableIterable(Iterable<T> it){
return nul,lableIterable(it,false); //Default behavior for most cases
}