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

Vin*_*ino 3 java exception optional

Java 8引入了OptionalAPI来表示可能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();
}
Run Code Online (Sandbox Code Playgroud)

情况2:引发检查异常

  private Item getItem(String itemName) throws ItemNotFound
   {
        for (Item item : items)
        {
            if (item.getName().equals(itemName))
                return item;
        }

        throw new ItemNotFound();
   }
Run Code Online (Sandbox Code Playgroud)

正如Martin Fowler所主张的那样,Optional/特殊情况模式是一种更好的做法,但是在这种简单的情况下,抛出一个受检查的异常也可以做到。

我应该关注哪一个?

Jan*_*son 6

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

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

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