Различия методов Optional.of и Optional.ofNullable в Java 8
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
При выборе между Optional.of
и Optional.ofNullable
можно провести аналогию со встречей со строгим и доброжелательным охранником. Optional.of
безоговорочно требует ненулевого значения, в противном случае вы получите NullPointerException
. Optional.ofNullable
с готовностью принимает нулевые значения, элегантно обработав их в Optional
.
Пример:
// Господин Строгость, ожидает от вас реального значения, иначе гнев неизбежен.
Optional<String> safeNonNull = Optional.of("NonNullValue");
// Господин Доброжелательность, улыбается, безразлично к вашему выбору.
Optional<String> safeNull = Optional.ofNullable(null); // Без последствий
Используйте Optional.of
, когда значение null является недопустимым и указывает на ошибку. Если же null является обычной частью логики вашего приложения, оптимальнее будет Optional.ofNullable
.
Борьба с 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
как две различные политики доступа:
Строгая политика входа в клуб 🚪👮♂️ (Optional.of):
Вам обязательно нужно иметь приглашение (значение) 💌; в обратном случае вам откажут во входе (Выброс исключения).
Гибкая политика входа в клуб 🚪👨✈️ (Optional.ofNullable):
Всё нормально, даже если у вас нет приглашения (значение может быть null) 🤷; проходи свободно (Не бояться исключений).
Optional.of
похож на вход в эксклюзивный клуб – либо вы подходите, либо вас не пустят. Optional.ofNullable
напоминает вход в уютное кафе – приветствуют всех гостей!
**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.