Зачем нужен null в Java?

212
20 октября 2021, 17:00

В каких случаях нужен null, кроме отложенной инициализации в java? Как определить на начальной стадии - может ли объект быть nullable?

Answer 1

Строго говоря null это не про объекты, а про ссылки на них, изначально null это ссылка на ячейку памяти с индексом ноль, первые ячейки памяти зарезервированы и хранят в себе информацию необходимую для работы процессора или других компонентов, скорее всего в ячейке с индексом ноль лежит какой-нибудь вектор прерывания, разумеется подобные участки памяти не доступны из "прикладного" кода, поэтому такую ссылку можно интерпретировать как ссылку на "ничто".

Подобного рода ссылка может применяться в первую очередь для разрешения сложной ситуации когда например вызывающий код хочет получить ссылку на какой-то элемент, а технической возможности предоставить эту ссылку нет (из-за состояния системы в конкретный момент времени) - в таких случаях не обязательно выбрасывать исключение ведь это достаточно дорогой с точки зрения затрат ресурсов процесс, а просто вернуть null и возложить обработку этого значения на вызывающий код. Аналогичным образом в методах, которые имеют несколько аргументов ссылочного типа - было бы очень нелепо городить перегрузки для каждого из них в том случае, если все эти параметры для метода не являются обязательными, удобнее создать одну точку входа, где обрабатывать параметры так, что они могут быть null. Так же такие ссылки очень часто используются для "параметризации" объектов, когда объект содержит поля и использует их в своей работе, например, отправляет http запросы, у него может быть "ссылка" на прокси сервер, которая разумеется может быть null и при этом не мешать работе объекта, ведь в таком случае он будет отправлять их напрямую.

Как определить на начальной стадии - может ли объект быть nullable?

По большей части это сугубо индивидуально и решается разработчиком в момент написания кода, и для упрощения работы в таких условиях в Java есть аннотации @Nullable и @NotNull. Разрабатывая свои классы рекомендую помечать соответствующими аннотациями типы возвращаемых методами значений, типы принимаемых методами параметров, типы доступных извне и в наследниках полей, если ожидается что они могут быть null или не могут соответственно. Разумеется только в тех случаях когда это не слишком очевидно, например если ваш метод должен, например, клонировать переданный объект, очевидного в него бессмысленно подавать null и тут никакая аннотация не нужна чтобы об этом догадаться.

На самом деле почти в любом языке программирования можно отказаться от констант null и вместо них пользоваться миллиардами логических переменных являющихся флажками, но подобный код будет мягко говоря не очень.

Answer 2

кроме отложенной инициализации

null нужен как минимум для того, чтобы проверить существование объекта (if (a != null) ...) или "обнулить" его (a = null), т.к. в JVM и .NET нет деструкторов как таковых и уничтожением объекта занимается сборщик мусора. Прибивая ссылки на объект путём того же присвоения null мы можем освободить память, т.к. после того как на объект не останется ни одной ссылки, он будет доступен для удаления сборщиком.

Как определить на начальной стадии может ли объект быть nullable?

Смотря что Вы подразумеваете под nullable. В общем случае любые объекты могут быть null. Если речь идёт о том, что объект может или не может иметь значение null с точки зрения логики работы программы, то здесь только проверка соответствующих аннотаций, атрибутов, принадлежности к определённому типу данных и т.п. (но, могу ошибаться).

READ ALSO
JSF файл не видит CDI класс и его поля

JSF файл не видит CDI класс и его поля

Всем приветСтараюсь активно учить Java

244
Написание редактора блога для сайта (WYSIWYG)

Написание редактора блога для сайта (WYSIWYG)

Подскажите редактор, который я мог бы добавить себе на сайт для того, чтобы я мог создавать в нем статьиНужен похожий редактор как у StackOverflow...

132
Вопрос по suppressed exceptions в рамках конструкции try-with-resources

Вопрос по suppressed exceptions в рамках конструкции try-with-resources

Вот цитата из книги Oracle-Certified-Professiona-Java-SE-8-Programmer-Exam-1Z0-809

84
Преобразование json

Преобразование json

Как разобрать json такого вида:

208