Як інші відзначили, контракт дозволяє відкинути анулює ...Map
[S] ome реалізації забороняють null
ключі та значення [...]. Спроба вставити невідповідний ключ або значення викликає неперевірений виняток, як правило, NullPointerException
або ClassCastException
.
... і колекторські фабрики (не лише на картах) цим користуються .
Вони забороняють null
ключі та значення. Спроби створити їх за допомогою null
ключів або значень призводять до NullPointerException
.
Але чому?
Дозвіл null
у колекціях на сьогодні розглядається як помилка дизайну. Це має безліч причин. Хороший варіант - це зручність використання, де найвідоміший виробник проблем Map::get
. Якщо він повертається null
, незрозуміло, чи відсутній ключ, чи значення було null
. Взагалі кажучи, колекції, які гарантовано null
безкоштовні, простіші у використанні. З точки зору реалізації, вони також вимагають менш спеціального корпусу, що робить код простішим у обслуговуванні та більш продуктивним.
Ви можете послухати, як Стюарт Маркс пояснює це в цій промові, але JEP 269 (той, що запровадив заводські методи) також резюмує це:
Нульові елементи, ключі та значення заборонені. (Жодні нещодавно представлені колекції не підтримують нульових значень.) Крім того, заборона нульових значень пропонує можливості для більш компактного внутрішнього представлення, швидшого доступу та меншої кількості особливих випадків.
Оскільки HashMap
це вже було в дикій природі, коли це повільно виявили, було занадто пізно змінювати його, не порушуючи існуючий код, але найновіші реалізації цих інтерфейсів (наприклад ConcurrentHashMap
) більше не дозволяють, null
і нові колекції для заводських методів не є винятком.
(Я думав, ще однією причиною було те, що явно використовували null
значень розглядалося як ймовірна помилка реалізації, але я це помилився. Це збиралося дублювати ключі, які також є незаконними.)
Отже, заборона null
мала деякі технічні причини, але це також було зроблено для підвищення надійності коду за допомогою створених колекцій.