2009-05-08 2 views
0

Можно создать дубликат:
What is the purpose of null?Нам действительно нужен NULL?

Есть фактическая потребность в NULL или нет? На большинстве языков OO, которые я запрограммировал, всегда существовал способ установить переменную в значение NULL, что приводит к разным смешным проблемам.

Что вы думаете?

+1

Это философски досадный вопрос. – Daniel

ответ

1

Можно создать язык, который не имеет значения NULL, но вместо этого неинициализированные значения указывают на одиночный фиктивный объект, который на самом деле ничего не делает. Вы можете сравнить указатели со ссылкой на этот фиктивный объект, а вызовы методов на объекте не приведут к действию или ошибке выполнения.

Этот метод трудно реализовать для статически типизированных языков, таких как C++ или Java.

+0

Да, очевидно (динамически типизированный) Objective-C ничего не делает, когда вы вызываете метод на объект nil, хотя он имеет нуль. –

4

NULL немного похож на Бога. Если бы этого не было, мы должны были создать его. Что-то должно представлять значение ссылки, которая не назначена (будь то потому, что она никогда не была назначена или в какой-то момент была очищена). Единственная альтернатива - использовать объект, который, фактически, заменяет NULL. Проблема в том, что если вы сделали все это, чтобы избежать исключения NullPointerException, теперь вы просто замените его на исключение UnexpectedObject или ClassCastException или нет.

+0

Определенно +1 для справки Вольтера. –

+0

+1 ха-ха .. это вроде смешно, но правда, я думаю .. –

+1

NULL немного похож на человека. Ибо Бог (Энтони Хоар) создал человека (NULL), а затем через несколько лет пожелал, чтобы он этого не сделал. –

0

В языках с сборкой мусора, где переменные являются фактическими местами хранения (в отличие от ярлыков Python), требуется значение NULL, чтобы обеспечить освобождение памяти до конца области переменной.

Кроме того, даже многие алгоритмы, написанные в псевдокоде, используют специальное значение NULL. Это всплывает буквально повсюду. Это центральное понятие в информатике.

0

Обычно имеются два специальных значения. Некоторые языки обрабатывают оба, некоторые только 1, и бросают ошибку с другой, а некоторые объединяют их. Эти два значения: Null и Undefined.

  • Undefined будет пытаться использовать переменную, которая утончаются не существует.

  • Null будет пытаться использовать переменную, которая существует, но имеет нет значения.

Null может быть полезным, поскольку оно является гарантированным значение, которое указывает на то, что что-то не так, или за пределами домена/диапазон возможных ответов. Возьмите Java, например:

Если у вас не было null, что делать, если вы сделали поиск в HashMap для чего-то, чего не было на карте? Что бы вы вернули? Если вы вернули объект, то как бы вы знали, что объект означает, что ничего не было, или это было на самом деле на карте. Обходные пути могут включать в себя создание собственного «NON_EXIST» объекта Constant, но это по сути то же самое, что и null. Другим обходным решением может стать исключение. Теперь вы смотрите на значительное влияние производительности.

Опять же, его идея иметь гарантированное допустимое значение, которое вы можете использовать. Он всегда доступен вам и всегда не связан с набором «реальных ценностей», которые обычно возвращаются из выполняемой вами операции. Null поэтому предназначенный специально для обозначения чего-то особенного.

Как я уже говорил, есть также оптимизации, которые могут быть сделаны здесь, а потому, что Null - это особое значение. В таких языках, как Java, если вы первоначально ссылались на объект исключительно по переменной, то установите эту переменную на null, которую вы удаляете эту ссылку, и позволяете сборщику мусора Java собирать данные, которые теперь не подлежат проверке. Если вместо этого вы позволяете этой переменной сидеть на веки, что кусок памяти, который никогда не будет использоваться снова, будет продолжать удерживать ресурсы. Это надуманный пример, но он доказывает точку, и в некоторых ресурсоемких Java-программах вы увидите эти явные присвоения null.

+0

Ваш пример не является проблемой, так как это очень распространенный отказ SRP. Если объект не существует, хэш-карта должна генерировать исключение. Нет серьезных проблем с производительностью, потому что должен существовать дополнительный метод «Существует». Такое злоупотребление «Нуль» получает мою козу. Тем не менее, чрезвычайно распространенный, поскольку это так удобно. – nicodemus13