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

最佳实践:使用Java8可选或引发异常,java,exception,optional,Java,Exception,Optional,Java8引入了OptionalAPI来表示运行时可能为null的值。在以下情况下,最好抛出一个选中的异常或返回一个可选的返回类型来表示边缘情况 案例1:返回类型可选 private Optional<Item> getItem(String itemName) { for (Item item : items) { if (item.getName().equals(itemName)) return Optional.of(

Java8引入了
Optional
API来表示运行时可能为
null
的值。在以下情况下,最好抛出一个选中的异常或返回一个
可选的
返回类型来表示边缘情况

案例1:返回类型
可选

private Optional<Item> getItem(String itemName)
{
    for (Item item : items)
    {
        if (item.getName().equals(itemName))
            return Optional.of(item);
    }

    return Optional.empty();
}
正如Martin Fowler所提倡的那样,
可选的
/特殊情况模式是一种更好的实践,但在这个简单的场景中,抛出一个选中的异常也能起到作用


我应该遵循哪一个?

这基本上归结为:缺少项的用例有意义吗

假设一个应用程序有用户。用户可以在其帐户信息中添加电话号码。因为他的号码不一定要在那里,所以可以使用可选号码。电话号码可能在那里,但可能不见了。客户端代码必须处理可选/可为空的值

另一方面,如果我想看他的电子邮件,这是注册期间的强制性要求。那么,例外就是出路。电子邮件必须存在,但不存在。这里客户端代码面临无效的应用程序状态/损坏的用户。

很简单:

  • 如果null是错误条件,则引发异常
  • 如果null是有效的返回值,则返回空的可选值

都不是,所有这些
null
-安全类型只是一个很大的开销,返回
null
,并记录结果可能为
null
的方法。我不认为
if(resultOptional.isPresent())
if(result==null)
有多大优势,但这可能是我的观点。同样地,
异常
应该只在极端情况下抛出cases@AxelH抱歉,我修复了我的代码示例。它应该是
throw new ItemNotFound()
异常情况应该使用异常,那么它是否是预期的功能?如果是,则您不希望出现异常,可以返回
null
可选项。没有“好办法”,请解释一下reason@Lino可选的存在是提供一种在代码(而不是文档)中表示可空性的方法。它的存在使得我们不必记住记录可空性。另外,只有在我们确定可选项是性能瓶颈之后,我们才能讨论开销。目前这只是过早的优化。谢谢。这是最有意义的。
  private Item getItem(String itemName) throws ItemNotFound
   {
        for (Item item : items)
        {
            if (item.getName().equals(itemName))
                return item;
        }

        throw new ItemNotFound();
   }