2009-05-08 5 views

Répondre

1

Il est possible de concevoir un langage qui n'a pas de valeur NULL mais à la place des valeurs non initialisées pointent vers un objet factice singleton qui ne fait rien. Vous pouvez comparer les pointeurs par rapport à la référence de cet objet factice et les appels aux méthodes sur l'objet n'entraînent aucune action ou erreur d'exécution.

Cette technique est difficile à mettre en œuvre pour les langages statiquement typés comme C++ ou Java.

+0

Ouais, apparemment (dynamiquement-typé) Objective-C ne fait rien quand vous appelez une méthode sur un objet nul, bien qu'il ait nil. –

4

NULL est un peu comme Dieu. Si ça n'existait pas, on finirait par en créer un. Quelque chose doit représenter la valeur d'une référence non attribuée (que ce soit parce qu'elle n'a jamais été affectée ou qu'elle a été effacée à un moment donné). La seule alternative est d'utiliser un objet qui remplace efficacement NULL. Le problème avec cela est que si vous avez fait tout cela pour éviter le NullPointerException, maintenant vous allez simplement le remplacer par une exception UnexpectedObject ou ClassCastException ou quoi que ce soit.

+0

Certainement +1 pour la référence Voltaire. –

+0

+1 ha ha .. c'est un peu drôle, mais vrai je suppose .. –

+1

NULL est un peu comme l'homme aussi. Pour Dieu (Anthony Hoare) a créé l'homme (NULL) et ensuite quelques années plus tard, il a souhaité ne pas l'avoir fait. –

0

Dans les langages avec garbage collection où les variables sont des emplacements de stockage réels (contrairement aux étiquettes Python), la valeur NULL est requise pour libérer la mémoire de manière propre avant la fin de la portée de la variable.

En outre, même de nombreux algorithmes écrits en pseudo-code utilisent la valeur spéciale NULL. Il apparaît littéralement partout. C'est un concept central en informatique.

0

Il existe normalement deux valeurs spéciales. Certaines langues gèrent les deux, certaines seulement 1 et jettent une erreur avec l'autre, et d'autres fusionnent les deux. Ces deux valeurs sont Null et Undefined.

  • Undefined essaierait d'utiliser une variable à plat n'existe pas.

  • Null essaie d'utiliser une variable qui existe mais a aucune valeur.

Null peut être utile car il est une valeur garantie qui indique que quelque chose ne va pas, ou en dehors du domaine/gamme de réponses possibles. Prenez Java par exemple:

Si vous n'aviez pas null, que se passe-t-il si vous avez fait une recherche dans un HashMap pour quelque chose qui n'existait pas dans la carte? Que voulez-vous retourner? Si vous retourniez un objet, comment sauriez-vous si cet objet signifiait qu'il n'y avait rien ou que c'était ce qui était réellement dans la carte? Les solutions de contournement pourraient inclure la création de votre propre objet constant "NON_EXIST", mais c'est essentiellement la même chose que ce que null est déjà de toute façon. Une autre solution de contournement peut être une exception. Vous examinez maintenant les principaux impacts sur le rendement.

Encore une fois, c'est l'idée d'avoir une valeur admissible garantie que vous pouvez utiliser. Il est toujours disponible pour vous et il est toujours disjoint de l'ensemble des «valeurs réelles» qui reviendraient normalement d'une opération que vous effectuez. Null est donc intentionnellement utilisé pour signifier quelque chose de spécial.

Comme je l'ai déjà dit, il existe également des optimisations qui peuvent être effectuées ici car Null est une valeur spéciale. Dans des langages tels que Java si vous avez initialement référencé un objet uniquement par une variable, définissez cette variable sur null. Vous supprimez cette référence et autorisez le Garbage Collector de Java à collecter les données non référencées. Si à la place vous laissez cette variable s'asseoir pour toujours, ce morceau de mémoire qui ne sera peut-être jamais utilisé à nouveau contiendra des ressources. Ceci est un exemple artificiel, mais cela prouve un point et dans certains programmes Java gourmands en ressources, vous verrez ces affectations explicites à null.

+0

Votre exemple est un non-problème, car il s'agit d'une défaillance très courante du SRP. Si l'objet n'existe pas, le hash-map devrait lancer une exception. Il n'y a pas de problèmes de performances majeurs, car il devrait y avoir une méthode "Exists" complémentaire. Ce genre d'abus de 'Null' obtient ma chèvre. Énormément commun, cependant, car c'est tellement pratique. – nicodemus13

Questions connexes