【发布时间】:2011-12-16 12:53:43
【问题描述】:
在 Optional 不存在的情况下,我会继续编写特定的异常抛出器。
例如:
Optional<?> optional = ...;
if (!optional.isPresent()) {
throw new MyException();
}
Object result = optional.get();
我发现这段代码不是很流畅,尤其是 bang (!) 的使用。我宁愿写这样的东西:
Optional<?> optional = ...;
Object result = optional.orThrow(MyException.class);
Guava 中是否有这样一个我还没找到的捷径?
【问题讨论】:
-
一般问题。如果你正在检查的东西是可选的,那么有一个像“Optional.orThrow”这样的方法是不是违反“可选”的概念?
-
完全同意。如果
isAbsent(在版本 11 中添加)是有效条件,则不应导致异常。Optional的要点是缺席是一个有效的非例外情况。如果缺席是例外情况,您的方法应该只返回对象并在缺席情况下抛出异常。 -
@black panda:那为什么我可以用
or()方法给一个默认值呢?这是一种允许默认行为发生的行为,为什么不是另一个呢? @John B:其中一个用例是一个相当通用的 XML 属性提取器:该属性可能存在也可能不存在,因此该方法返回一个Optional。然后调用者可能想要强制值的存在(通过抛出异常),或者获取值(如果有),甚至检索默认值。提取器方法只是不知道调用者想对这个值做什么,所以它必须返回一个Optional。为什么这个用例会无效? -
另外,您回答的唯一问题是我强烈不同意 Guava:“在我们有限的用例集中完全按照我们的意图使用或离开”方法。这种方法是我在 Guava 中看到的唯一缺点——一个很大的缺点,但仍然是唯一的缺点。我爱所有的休息。我本来希望不要在这里找到同样的“不”墙。顺便说一句,第 11 版不包括
isAbsent()(参见 Guava 的第 734 期) -
@ogregoire:如果某些东西是可选的,那么默认值是可以接受的,这是一种常见且预期的行为。这是可选内容的自然延伸。 “你不指定?哦,好吧,反正是可选的,我就用默认值。”不是“这是可选的。你没有提供它?然后我会抛出一个异常,因为它必须存在。”