Моя проблема в том, что это зависит от того, откуда приходят ключи.
Если они вводятся каким-либо пользователем или ненадежной системой, тогда я использую Option
, чтобы я мог осмысленно обозначить возможность неизвестного ключа и правильно с ним справиться.
С другой стороны, если ключи поступают из известной системы (это включает в себя такие вещи, как ключи, встроенные в ссылки, которые изначально исходили из системы) и считаются действительными и существуют, я бы оставил их как среду выполнения исключение, обработанное всеобъемлющим на внешнем уровне. Для примера ссылки, если кто-то вручную изменяет ключ в URL-адресе по той или иной причине, его следует рассматривать как неопределенное поведение, и для него подходит исключение, IMO.
Еще один способ думать об этом - как бы вы справились с ситуацией, когда она возникает. Если вы используете Option
и просто делегируете случай None
какой-то всеобъемлющей обработке ошибок, то, вероятно, более подходящим является исключение. Если вы явно перехватываете исключение NotFound и изменяете поток программы (например, запрашиваете у пользователя повторный ввод ключа), тогда используйте Option
, или проверенное исключение (или Either
в Scala), чтобы убедиться, что Ситуация разбирается.
Что касается интеграции с Java, Option
достаточно прост в использовании, когда библиотека времени выполнения Scala доступна на пути к классам. Кроме того, в библиотеке Functional Java есть реализация Option
. В любом случае, я бы воздержался от использования null
для обозначения «не найдено».