Говоря как разработчик Guava, позвольте мне попытаться распаковать здесь логику. Отвечая как на исходный вопрос, так и на комментарий, прямо на вопрос:
Это абсолютно тот случай, когда мы пытаемся заставить пользователей Guava уважать наши стандарты хороших привычек программирования. (Наши стандарты: сильно под влиянием, например, эффективной Java.)
Это говорит о том, что в этом конкретном вопросе есть совершенно хорошие варианты использования: «если отсутствует, выведите исключение «. Возможно, вы реализуете класс, к которому можно получить доступ в обоих направлениях - один метод с необязательным возвращаемым значением и один метод, который предполагает, что значение всегда будет присутствовать, иначе исключая исключение. Интерфейс Deque, например, предоставляет специальные и исключающие исключения версии peek, poll и offer.
Все, что сказал, в меру моего понимания, Истинный гуавы способ сделать это ...
if (value.isPresent()) {
return value.get();
} else {
throw new MyException();
}
Метод «orThrow» вы предлагаете требует отражения (!!), не делает позволяют настраивать исключение с полезным сообщением и т. д. «Обычный способ» отлично читается и более эффективен.
Иногда Guava не обеспечивает явной поддержки для вещей, потому что для этих случаев использования мы считаем, что лучше всего делать только «обычный путь». Я думаю, что это так.
Общий вопрос. Если вещь, которую вы проверяете, является опциональной, не против концепции «необязательный» иметь метод «Необязательный.orThrow»? –
Полностью согласен. Если 'isAbsent' (добавлено в версии 11) является допустимым условием, это не должно приводить к исключению. Пункт «Необязательный» - это отсутствие действительного не исключительного случая. Если отсутствует исключительный случай, ваш метод должен просто вернуть объект, а также исключить и исключить в отсутствующем случае. –
@black panda: тогда почему я могу присвоить значение по умолчанию с помощью метода 'or()'? Это своего рода разрешение поведения по умолчанию, почему бы и другое? @ John B: Один из вариантов использования - довольно общий экстрактор атрибутов XML: этот атрибут может присутствовать или отсутствовать, поэтому метод возвращает «Необязательный». Затем вызывающий может захотеть принудительно использовать присутствие значения (путем исключения исключения) или получить значение, если оно есть, или даже получить значение по умолчанию. Метод экстрактора просто не знает, что вызывающий объект хочет сделать со значением, поэтому он должен вернуть «Необязательный». Почему этот случай использования недействителен? –