Итератор нулевой коллекции

Довольно часто, что я должен проверять значение 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
}