Die Funktion, die ohne null nicht funktionieren könnte, kann "das Fehlen eines Objekts" darstellen.
Das Fehlen eines Objekts ist ein wichtiges Konzept. In der objektorientierten Programmierung benötigen wir sie, um eine optionale Zuordnung zwischen Objekten darzustellen: Objekt A kann an ein Objekt B angehängt werden, oder A hat möglicherweise kein Objekt B. Ohne Null könnten wir dies dennoch emulieren: zum Beispiel Wir könnten eine Liste von Objekten verwenden, um B mit A zu verknüpfen. Diese Liste könnte ein Element (ein B) enthalten oder leer sein. Dies ist etwas unpraktisch und löst nichts wirklich. Code, der davon ausgeht, dass es ein B gibt, wie aobj.blist.first().method()
es in ähnlicher Weise wie eine Nullreferenzausnahme explodiert: (Wenn blist
es leer ist, wie verhält es sich blist.first()
?)
Apropos Listen: Mit null können Sie eine verknüpfte Liste beenden. A ListNode
kann einen Verweis auf einen anderen enthalten, ListNode
der null sein kann. Gleiches gilt für andere dynamische Mengenstrukturen wie Bäume. Mit Null können Sie einen normalen Binärbaum haben, dessen Blattknoten durch untergeordnete Referenzen gekennzeichnet sind, die null sind.
Listen und Bäume können ohne Null erstellt werden, müssen jedoch kreisförmig oder unendlich / faul sein. Dies wird wahrscheinlich von den meisten Programmierern als inakzeptable Einschränkung angesehen, die es vorziehen würden, beim Entwerfen von Datenstrukturen die Wahl zu haben.
Die mit Nullreferenzen verbundenen Schmerzen, wie Nullreferenzen, die versehentlich aufgrund von Fehlern auftreten und Ausnahmen verursachen, sind teilweise eine Folge des statischen Typsystems, das in jeden Typ einen Nullwert einführt: Es gibt einen Null-String, eine Null-Ganzzahl, ein Null-Widget, ...
In einer dynamisch typisierten Sprache kann es ein einzelnes Nullobjekt geben, das einen eigenen Typ hat. Das Ergebnis ist, dass Sie alle Darstellungsvorteile von Null sowie mehr Sicherheit haben. Wenn Sie beispielsweise eine Methode schreiben, die einen String-Parameter akzeptiert, ist garantiert, dass der Parameter ein String-Objekt und nicht null ist. In der String-Klasse gibt es keine Nullreferenz: Etwas, von dem bekannt ist, dass es ein String ist, kann nicht das Objekt null sein. Referenzen haben keinen Typ in einer dynamischen Sprache. Ein Speicherort wie ein Klassenmitglied oder ein Funktionsparameter enthält einen Wert, der eine Referenz auf ein Objekt sein kann. Dieses Objekt hat den Typ, nicht die Referenz.
Diese Sprachen bieten also ein sauberes, mehr oder weniger matematisch reines Modell von "Null", und die statischen verwandeln es dann in ein Frankenstein-Monster.