番石榴的快捷方式 可选使用例外?

2022-09-02 11:27:57

我一直在编写特定的异常抛出器,以防缺少 Optional。

例如:

Optional<?> optional = ...;
if (!optional.isPresent()) {
  throw new MyException();
}
Object result = optional.get();

我发现这段代码不是很流畅,特别是使用砰(!我宁愿写这样的东西:

Optional<?> optional = ...;
Object result = optional.orThrow(MyException.class);

番石榴有我没有找到的捷径吗?


答案 1

作为一名番石榴开发者,让我试着解开这里的逻辑。同时回答原始问题,并直接在问题上回复评论线程:

我们试图迫使Guava用户尊重我们良好的编程习惯标准,这绝对是事实。(我们的标准受到有效Java等的强烈影响。

也就是说,我同意你在这个特定问题中提到的行为有很好的用例:“如果没有,就抛出一个例外。也许您正在实现一个可以双向访问的类 - 一个具有 Optional 返回值的方法,以及一个假定该值将始终存在的方法,否则将引发异常。例如,Deque 接口提供特殊值和异常抛出版本的速览、轮询和优惠。

总而言之,据我所知,真正的番石榴方式是......

if (value.isPresent()) {
  return value.get();
} else {
  throw new MyException();
}

您提出的“orThrow”方法需要反射(!!),不允许您使用有用的消息自定义异常等。“正常方式”是完全可读的,并且更有效。

有时Guava不会为事物提供明确的支持,因为对于这些用例,我们认为最好以“正常方式”完成。我认为这里的情况就是这样。


答案 2

Java 8有一个允许请求行为的方法,这一点也就不值了。OptionalorElseThrow(Supplier)

它是这样使用的:

Optional<Object> reference = Optional.empty()
reference.orElseThrow(MyOwnException::new); // Throws a new MyOwnException

此外,在 Java 10 中添加了一个方法,该方法在 不存在值时会抛出一个。orElseThrow()NoSuchElementException

Optional<Object> reference = Optional.empty();
reference.orElseThrow(); // Throws a new NoSuchElementException

推荐