Различия методов Optional.of и Optional.ofNullable в Java 8

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

При выборе между Optional.of и Optional.ofNullable можно провести аналогию со встречей со строгим и доброжелательным охранником. Optional.of безоговорочно требует ненулевого значения, в противном случае вы получите NullPointerException. Optional.ofNullable с готовностью принимает нулевые значения, элегантно обработав их в Optional.

Пример:

Java
Скопировать код
// Господин Строгость, ожидает от вас реального значения, иначе гнев неизбежен.
Optional<String> safeNonNull = Optional.of("NonNullValue");
// Господин Доброжелательность, улыбается, безразлично к вашему выбору.
Optional<String> safeNull = Optional.ofNullable(null); // Без последствий

Используйте Optional.of, когда значение null является недопустимым и указывает на ошибку. Если же null является обычной частью логики вашего приложения, оптимальнее будет Optional.ofNullable.

Кинга Идем в IT: пошаговый план для смены профессии

Борьба с null: исключения против принятия

Представьте работу с null как попытку избежать кошек в своём коде. Optional.of действует как отпугиватель, строя чёткую границу, через которую не просочатся ни кошки (null), ни мыши (ошибки).

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

Выражение намерений кода

Применение Optional.of или Optional.ofNullable подчёркивает намерения вашего кода. Код с Optional.of заявляет о жестком ожидании ненулевых значений, так же как и предупреждающая табличка "Осторожно, злой пес!", а Optional.empty явно указывает на признание нулевого значения.

Встреча с уклончивым NullPointerException

Считайте NullPointerException спринтом: он немедленно обнаруживает проблему, позволяя незамедлительно исправить её. Это типическая прямота Optional.of. В свою очередь, Optional.ofNullable может превратить отладку в марафон, облегчая поиск проблемы.

Объединение с устаревшим кодом

Optional.ofNullable служит миру между новым и устаревшим кодом, облегчая интеграцию Optional и плавный переход от старых подходов к новым.

Расшифровка назначения методов

Суффикс "ofNullable" в Optional.ofNullable говорит о готовности смириться с null, прямо будто надевает значок с надписью "null ему здесь приемлем".

Клиника работы с null

Сочетание Optional.ofNullable с методами типа Optional.map и Optional.flatMap создаёт эффективное средство обработки null. Все они действуют согласно чёткому принципу "не оживлять null" (DNR).

Мнимая защита от null

Optional – это отличный инструмент защиты от null, но нужно быть умеренным. Избыточное использование Optional, особенно в параметрах методов, может привести к излишнему оборонительному программированию. Он должен быть поддержкой, а не навязчивой отвлекающей деталью.

Послание null

NullPointerException, возникающий из-за Optional.of, действует как сигнал тревоги, призывая осторожней обращаться с null. Это как строгий родитель, не допускающий отступления от правил. Optional.ofNullable, напротив, напоминает доброго дядю, который примет вас с любыми недостатками, но не обезопасит от несчастных случаев.

Визуализация

Представьте себе Optional.of и Optional.ofNullable как две различные политики доступа:

Markdown
Скопировать код
Строгая политика входа в клуб 🚪👮‍♂️ (Optional.of):
  Вам обязательно нужно иметь приглашение (значение) 💌; в обратном случае вам откажут во входе (Выброс исключения).

Гибкая политика входа в клуб 🚪👨‍✈️ (Optional.ofNullable):
  Всё нормально, даже если у вас нет приглашения (значение может быть null) 🤷; проходи свободно (Не бояться исключений).

Optional.of похож на вход в эксклюзивный клуб – либо вы подходите, либо вас не пустят. Optional.ofNullable напоминает вход в уютное кафе – приветствуют всех гостей!

Markdown
Скопировать код
**Optional.of** => 🚪👮‍♂️💌: Эксклюзив (Требует ненулевое значение)
**Optional.ofNullable** => 🚪👨‍✈️🤷: Для всех (Допускает null)

Практическое применение

Optional.ofNullable становится вашим соратником при работе с пользовательским вводом или настройками, где null может означать "ничего".

Optional.of же лучше всего показывает себя во внутренних вычислениях кода, где отсутствие значения может указывать на возможные ошибки.

При создании API использование Optional в качестве возвращаемого типа данных подчёркивает для пользователей возможное отсутствие значения.

При выборе между Optional и примитивами учитывайте производительность, так как преобразования могут создать нежелательную нагрузку. В этом случае рассмотрите варианты OptionalInt, OptionalLong или OptionalDouble.

Полезные материалы

1 Optional (Java Platform SE 8) — официальная документация Optional от Oracle. 2 Why should Java 8's Optional not be used in arguments – Stack Overflow — обсуждение в сообществе о применении Optional в аргументах методов. 3 Tired of Null Pointer Exceptions? Consider Java SE 8's Optional – Oracle Blog — трюки и лучшие практики использования Optional для предотвращения ошибок, связанных с null. 4 26 Reasons Why Using Optional Correctly Is Not Optional – DZone — причины правильного использования Optional с практическими советами. 5 Java GridBagLayout positioning – Stack Overflow — обсуждение Optional.of и Optional.ofNullable в контексте использования GridBagLayout. 6 Optional by Stuart Marks – YouTube — видеолекция, объясняющая лучшие практики использования Optional в Java 8.