Член команды Guava здесь.
Вероятно, самым большим недостатком null
является то, что неясно, что он должен означать в любом данном контексте: у него нет иллюстративного названия. Не всегда очевидно, что это null
означает «нет значения для этого параметра» - черт возьми, в качестве возвращаемого значения иногда это означает «ошибку», или даже «успех» (!!), или просто «правильный ответ - ничего». Optional
часто это понятие, которое вы имеете в виду, когда делаете переменную допускающей значение NULL, но не всегда. Если это не так, мы рекомендуем вам написать свой собственный класс, похожий на, Optional
но с другой схемой именования, чтобы прояснить, что вы на самом деле имеете в виду.
Но я бы сказал, что самое большое преимущество Optional
не в удобочитаемости: преимущество в его защищенности от идиотов. Это заставляет вас активно думать об отсутствующем случае, если вы хотите, чтобы ваша программа вообще компилировалась, поскольку вам нужно активно развернуть Optional
и обработать этот случай. Null позволяет легко забыть о чем-то, и хотя FindBugs помогает, я не думаю, что он решает проблему почти так же. Это особенно актуально, когда вы возвращаете значения, которые могут или не могут быть «присутствующими». У вас (и других) гораздо больше шансов забыть, что other.method(a, b)
может возвращать null
значение, чем вы, вероятно, забудете, что a
могло бы быть null
при реализации other.method
. ВозвращениеOptional
делает невозможным для вызывающих забыть этот случай, поскольку они должны сами развернуть объект.
По этим причинам мы рекомендуем использовать Optional
в качестве возвращаемого типа для ваших методов, но не обязательно в аргументах вашего метода.
(Это, кстати, полностью взято из обсуждения здесь .)