user_of_toster
@user_of_toster

В чем плюсы и минусы у возможности возвращать null вместо возвращаемого типа?

Пример на Typescript:
function getStringsArray(): string[] {
    return null // Type 'null' is not assignable to type 'string[]';
}

Пример на Java:
public static String[] getStringsArray() {
    return null; // OK
}

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

Во втором варианте создателю метода проще прокидывать null, если объекта нет, но потребителям придется делать проверки.

Есть ли другие плюсы и минусы? Хочу понять, чем руководствовались создатели языка при принятии этого решения
  • Вопрос задан
  • 287 просмотров
Решения вопроса 4
zagayevskiy
@zagayevskiy
Android developer at Yandex
nullабельные ссылки в джаве — это ошибка на миллиарды долларов.
Никаких плюсов у этого нет, просто в момент разработки не было мысли о том, что нужно добавить опциональные типы в систему типов. Позже это попытались решить аннотациями типа NotNull/Nullable, но они полностью не решают проблему, и к тому же очень вербозны.
Ответ написан
Adamos
@Adamos
Если не ошибаюсь, в Джаве дело не в том, что можно вернуть из функции null, а в том, что любой объект может иметь значение null, пока не инициализирован. Приведенный вариант - просто одна из возможностей использования этого свойства языка.
Хотя, разумеется, возвращать null туда, где вызывающий код ожидает результат - дурная практика. Такое имеет смысл в C, а в Джаве, да и в большинстве ООП-языков, для подобных ситуаций следует использовать исключения.
Ответ написан
@Akela_wolf
Extreme Programmer
Вообще null означает "нет объекта". Плюсы такого решения:
Универсальность кода. Нет объекта - верни null. Один и тот же null. Всегда. Эта история идет из C++ и его указателей, для которых NULL - вполне нормальное значение. Хочешь проверить существование объекта - сравни с null.

Минусы:
Нужно постоянно проверять возвращенное значение на null, так как он может вывалиться откуда угодно. Хоть где-то забыл проверить - получил NullPointerException.

Собственно минусы здесь значительно перевешивают плюсы. Именно поэтому в Java появился тип Optional. А в современных языках, таких как Kotlin (ну и в приведенном примере на Typesript) в дизайне языка явно заложена проверка типа nullable/non-nullable. Про Typescript не скажу, а вот компилятор Котлина на уровне проверки типов не даст совершить с nullable типом небезопасную операцию. А если в non-nullable тип все-таки просочится null (например из Java-библиотеки), то эксепшен в рантайме будет выброшен сразу же, не дожидаясь когда будет обращение к полю или методу этого объекта (типичная ситуация для Java, когда NPE "сидит в засаде", дожидаясь пока звезды сойдутся нужным образом и обязательно на продакшене)
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Плюсов нет, минусов навалом - Google: Ошибка на миллиард долларов.
Хорошо что TS не даёт возможности неявно передать null.

Во всех современных языках пытаются от этого уйти, либо при помощи обязательных аннотаций, либо при помощи системы типов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы