Java 8引入了Optional
API来表示在运行时可能为null
的值。在以下情况下,是否最好抛出一个已检查的异常或返回一个Optional
返回类型来表示边缘情况?
情况1:返回类型Optional
private Optional<Item> getItem(String itemName)
{
for (Item item : items)
{
if (item.getName().equals(itemName))
return Optional.of(item);
}
return Optional.empty();
}
情况2:引发检查异常
private Item getItem(String itemName) throws ItemNotFound
{
for (Item item : items)
{
if (item.getName().equals(itemName))
return item;
}
throw new ItemNotFound();
}
正如马丁·福勒(Martin Fowler)所主张的那样,Optional
/特殊情况模式是一种更好的做法,但是在这种简单的情况下,抛出一个受检查的异常也可以完成这项工作。
我应该关注哪个人?
答案 0 :(得分:3)
这基本上可以归结为:缺少该用例是否有意义?
让我们说一个应用有用户。用户可以将电话号码添加到他的帐户信息中。由于他的俯卧位号码不必存在,因此可以使用可选的。电话号码可能在那里,但可能丢失。客户端代码必须处理Optional / nullable值。
另一方面,如果我想查看他的电子邮件,这是注册期间的必填项。然后例外就是要走的路。电子邮件必须在那里,但不是。客户端代码在这里面对无效的应用程序状态/损坏的用户。
答案 1 :(得分:1)
很简单: