最佳实践:使用Java 8可选或引发异常

时间:2019-02-05 11:37:21

标签: java exception optional

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 /特殊情况模式是一种更好的做法,但是在这种简单的情况下,抛出一个受检查的异常也可以完成这项工作。

我应该关注哪个人?

2 个答案:

答案 0 :(得分:3)

这基本上可以归结为:缺少该用例是否有意义?

让我们说一个应用有用户。用户可以将电话号码添加到他的帐户信息中。由于他的俯卧位号码不必存在,因此可以使用可选的。电话号码可能在那里,但可能丢失。客户端代码必须处理Optional / nullable值。

另一方面,如果我想查看他的电子邮件,这是注册期间的必填项。然后例外就是要走的路。电子邮件必须在那里,但不是。客户端代码在这里面对无效的应用程序状态/损坏的用户。

答案 1 :(得分:1)

很简单:

  • 如果null为错误条件,则引发异常。
  • 如果null为有效的返回值,则返回一个空的Optional。