2009-05-08 8 views
0

Mögliche Duplizieren:
What is the purpose of null?Brauchen wir wirklich NULL?

Gibt es einen tatsächlichen Bedarf an NULL oder nicht? In den meisten von mir programmierten OO-Sprachen gab es immer eine Möglichkeit, eine Variable auf einen NULL-Wert zu setzen, was zu allen möglichen komischen Problemen führte.

Was sind Ihre Gedanken?

+1

Dies ist eine philosophisch ärgerliche Frage. – Daniel

Antwort

1

Es ist möglich, eine Sprache zu entwerfen, die keine NULL-Werte, sondern nicht initialisierte Werte enthält, die auf ein Dummy-Singleton-Objekt zeigen, das eigentlich gar nichts tut. Sie könnten Zeiger mit der Referenz dieses Dummy-Objekts vergleichen, und Aufrufe von Methoden für das Objekt würden zu keiner Aktion oder einem Laufzeitfehler führen.

Diese Technik ist schwer für statisch typisierte Sprachen wie C++ oder Java zu implementieren.

+0

Ja, anscheinend (dynamisch typisiert) Objective-C tut nichts, wenn Sie eine Methode für ein Null-Objekt aufrufen, obwohl es nichts hat. –

4

NULL ist ein bisschen wie Gott. Wenn es nicht existierte, würden wir am Ende eines erstellen müssen. Etwas muss den Wert einer Referenz darstellen, die nicht zugewiesen ist (sei es, weil sie nie zugewiesen wurde oder an einem bestimmten Punkt gelöscht wurde). Die einzige Alternative besteht darin, ein Objekt zu verwenden, das effektiv NULL ersetzt. Das Problem dabei ist, dass Sie, wenn Sie alles getan haben, um die NullPointerException zu vermeiden, jetzt einfach die UnexpectedObject-Ausnahme oder ClassCastException ersetzen oder was auch immer.

+0

Definitiv +1 für die Voltaire-Referenz. –

+0

+1 ha ha .. das ist irgendwie lustig, aber wahr, ich denke .. –

+1

NULL ist ein wenig wie der Mensch auch. Denn Gott (Anthony Hoare) schuf den Menschen (NULL) und wünschte sich dann ein paar Jahre später, er hätte es nicht getan. –

0

In Sprachen mit Garbage Collection, bei denen Variablen tatsächliche Speicherorte sind (im Gegensatz zu Pythons Labels), ist der Wert NULL erforderlich, um Speicher auf saubere Weise vor dem Ende des Gültigkeitsbereichs der Variablen freigeben zu können.

Auch viele in Pseudocode geschriebene Algorithmen nutzen den speziellen Wert NULL. Es taucht buchstäblich überall auf. Es ist ein zentrales Konzept in der Informatik.

0

Normalerweise gibt es zwei spezielle Werte. Einige Sprachen behandeln beide, einige nur 1 und einen Fehler mit dem anderen, und einige verschmelzen die beiden. Diese zwei Werte sind Null und Undefined.

  • Undefined würde versuchen, eine Variable zu verwenden, die flach aus nicht existiert.

  • Null würde versucht, eine Variable zu verwenden, die existiert aber kein Wert.

Null kann nützlich sein, weil es einen garantierten Wert, der angibt, dass etwas nicht in Ordnung ist, oder außerhalb der Domäne/Bandbreite möglicher Antworten. Nehmen Sie Java zum Beispiel:

Wenn Sie nicht null, was, wenn Sie eine Suche in einem HashMap für etwas, das nicht in der Karte vorhanden war, haben? Was würdest du zurückgeben? Wenn Sie ein Objekt zurückgeben würden, wie würden Sie dann wissen, ob dieses Objekt bedeutete, dass nichts da war oder das, was tatsächlich in der Map war. Zu den Problemumgehungen könnte das Erstellen eines eigenen Konstantenobjekts "NON_EXIST" gehören, aber das ist im Wesentlichen dasselbe wie das, was bereits null ist. Eine andere Problemumgehung könnte das Auslösen einer Ausnahme sein. Jetzt sehen Sie sich große Auswirkungen auf die Leistung an.

Auch seine die Idee, einen garantierten zulässigen Wert zu haben, die Sie verwenden können. Es ist immer für Sie verfügbar und es ist immer unabhängig von der Menge der "echten Werte", die normalerweise von einer ausgeführten Operation zurückgegeben werden. Null wird daher absichtlich verwendet, um etwas Besonderes zu bedeuten.

Wie bevor ich angedeutet, gibt es auch Optimierungen, die auch hier getan werden kann, weil Null ein spezieller Wert ist. In Sprachen wie Java, wenn Sie ursprünglich ein Objekt nur durch eine Variable referenziert haben, setzen Sie diese Variable auf null. Sie entfernen diese Referenz und erlauben dem Garbage Collector von Java, die nun nicht referenzierten Daten zu sammeln. Wenn Sie stattdessen diese Variable für immer herumstehen lassen, wird dieser Speicherbereich, der möglicherweise nie wieder verwendet wird, weiterhin Ressourcen enthalten. Dies ist ein künstliches Beispiel, aber es beweist einen Punkt und in einigen ressourcenintensiven Java-Programmen sehen Sie diese expliziten Zuweisungen zu null.

+0

Ihr Beispiel ist kein Problem, da es sich um einen sehr häufigen Fehler der SRP handelt. Wenn das Objekt nicht existiert, sollte die Hash-Map eine Ausnahme auslösen. Es gibt keine größeren Leistungsprobleme, da es eine ergänzende "Exists" -Methode geben sollte. Diese Art von Missbrauch von "Null" bringt meine Ziege. Sehr verbreitet, aber so praktisch. – nicodemus13