Функция, которая не может работать без нуля, может отображать «отсутствие объекта».
Отсутствие объекта является важной концепцией. В объектно-ориентированном программировании это необходимо для представления необязательной ассоциации между объектами: объект A может быть присоединен к объекту B, или A может не иметь объекта B. Без нуля мы все еще можем эмулировать это: например, мы можем использовать список объектов, чтобы связать B с A. Этот список может содержать один элемент (один B) или быть пустым. Это несколько неудобно и ничего не решает. Код, который предполагает наличие B, такой как aobj.blist.first().method()
, будет взорван аналогично исключению нулевой ссылки: (если blist
пусто, каково поведение blist.first()
?)
Говоря о списках, null позволяет завершить связанный список. ListNode
может содержать ссылку на другой ListNode
, который может быть нулевым. То же самое можно сказать и о других структурах динамических множеств, таких как деревья. Null позволяет вам иметь обычное двоичное дерево, у которого конечные узлы отмечены нулевыми дочерними ссылками.
Списки и деревья могут быть построены без нуля, но они должны быть круглыми, или же бесконечными / ленивыми. Это, вероятно, будет рассматриваться как неприемлемое ограничение для большинства программистов, которые предпочли бы иметь выбор при проектировании структур данных.
Боли, связанные с нулевыми ссылками, такие как нулевые ссылки, возникающие случайно из-за ошибок и вызывающих исключения, частично являются следствием статической системы типов, которая вводит нулевое значение в каждый тип: есть пустая строка, нулевое целое число, нулевой виджет, ...
В динамически типизированном языке может существовать один нулевой объект, который имеет свой собственный тип. Результатом этого является то, что у вас есть все представительные преимущества нуля, плюс большая безопасность. Например, если вы напишите метод, который принимает параметр String, то вам гарантируется, что этот параметр будет строковым объектом, а не нулевым. В классе String нет нулевой ссылки: то, что известно как String, не может быть нулевым объектом. Ссылки не имеют типа в динамическом языке. Место хранения, такое как член класса или параметр функции, содержит значение, которое может быть ссылкой на объект. Этот объект имеет тип, а не ссылку.
Таким образом, эти языки обеспечивают чистую, более или менее математически чистую модель «нуля», а затем статические превращают ее в своего рода монстра Франкенштейна.