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