Почему ImmutableList.of() и friends запрещают нулевые элементы?
-
20-09-2019 - |
Вопрос
Резюме в значительной степени говорит само за себя.Вот соответствующий фрагмент кода в ImmutableList.createFromIterable()
:
if (element == null) {
throw new NullPointerException("at index " + index);
}
Я сталкивался с этим несколько раз и не могу понять, почему библиотечная функция общего назначения должна налагать это ограничение.
Правка 1:говоря "общего назначения", я был бы доволен в 95% случаев.Но я не думаю, что написал 100 звонков в ImmutableList.of()
тем не менее, и были укушены этим не один раз.Хотя, может быть, я и не такой, как все.:)
Правка 2:Я предполагаю, что моя большая жалоба заключается в том, что это создает "заминку" при взаимодействии со стандартным java.util
Коллекции.Как вы отметили в своем выступлении, проблемы с null
s в коллекциях могут отображаться далеко от того места, где были вставлены эти нули.Но если у меня есть длинная цепочка кода, которая помещает нули в стандартную коллекцию на одном конце и правильно обрабатывает их на другом, то я не смогу заменить класс Google collections в любой момент пути, потому что это немедленно выдаст NullPointerException
.
Решение
Я объяснил это на 25-минутной части этого видео:http://www.youtube.com/watch?v=ZeO_J2OcHYM
Извините за ленивый ответ, но это, в конце концов, всего лишь вопрос "почему" (возможно, не подходит для StackOverflow?).
Редактировать: Вот еще один момент, который я не уверен, что ясно изложил в видео:общее (по всему мировому Java-коду) количество дополнительного кода, которое необходимо написать для этих случаев, благоприятных для использования старых резервных версий Collections.unmodifiableList(Arrays.asList(...))
и т.д.перегружен общим (по всему мировому Java-коду) количеством дополнительных checkArgument(!foos.contains(null))
звонки, которые нужно было бы добавлять каждому, если бы наши коллекции не позаботились об этом за вас.Безусловно, большинство способов использования коллекции не ожидают присутствия каких-либо нулей и действительно должны быстро завершиться сбоем, если таковые имеются.
Другие советы
В целом, разработчики Google Collections принадлежат к группе, которая не считает, что значения null должны быть ожидаемым параметром общего назначения.
Одна из причин заключается в том, что это позволяет функциям, работающим со списком, не проверять каждый элемент на наличие Null, что значительно повышает производительность.