Wie andere betonten, erlaubt der Map
Vertrag die Ablehnung von Nullen ...
Einige Implementierungen verbieten null
Schlüssel und Werte [...]. Der Versuch, einen nicht berechtigten Schlüssel oder Wert einzufügen, löst normalerweise NullPointerException
oder eine ungeprüfte Ausnahme aus ClassCastException
.
... und die Sammelfabriken (nicht nur auf Karten) machen davon Gebrauch .
Sie verbieten null
Schlüssel und Werte. Versuche, sie mit null
Schlüsseln oder Werten zu erstellen, führen dazu NullPointerException
.
Aber wieso?
Das Zulassen null
von Sammlungen wird mittlerweile als Entwurfsfehler angesehen. Dies hat verschiedene Gründe. Eine gute ist die Benutzerfreundlichkeit, bei der der bekannteste Problemlöser ist Map::get
. Wenn es zurückkehrt null
, ist unklar, ob der Schlüssel fehlt oder der Wert war null
. Im Allgemeinen sind Sammlungen, die garantiert null
kostenlos sind, einfacher zu verwenden. In Bezug auf die Implementierung erfordern sie auch weniger spezielles Gehäuse, wodurch der Code einfacher zu warten und leistungsfähiger ist.
Sie können Stuart Marks zuhören, der es in diesem Vortrag erklärt, aber JEP 269 (derjenige, der die Factory-Methoden eingeführt hat) fasst es auch zusammen:
Nullelemente, Schlüssel und Werte werden nicht zugelassen. (Keine kürzlich eingeführten Sammlungen haben Nullen unterstützt.) Darüber hinaus bietet das Verbot von Nullen die Möglichkeit einer kompakteren internen Darstellung, eines schnelleren Zugriffs und weniger Sonderfällen.
Da dies HashMap
bereits in freier Wildbahn war, als dies langsam entdeckt wurde, war es zu spät, es zu ändern, ohne den vorhandenen Code zu beschädigen, aber die neuesten Implementierungen dieser Schnittstellen (z. B. ConcurrentHashMap
) lassen dies nicht null
mehr zu und die neuen Sammlungen für die Factory-Methoden sind keine Ausnahme.
(Ich dachte, ein anderer Grund war die explizite Verwendung null
Werten als wahrscheinlicher Implementierungsfehler angesehen wurde, aber ich habe das falsch verstanden. Das war dabei, Schlüssel zu duplizieren, die ebenfalls illegal sind.)
Das Nichtzulassen null
hatte also einen technischen Grund, wurde aber auch durchgeführt, um die Robustheit des Codes mithilfe der erstellten Sammlungen zu verbessern.