代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

我应该使用空返回值、检查异常或可能的空对象模式来设计以下API吗?

  •  2
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    我来到一个API getStock 设计,在我没有很好的判断,我应该如何处理操作失败。

    API将使我能够传递股票代码,如果成功,则返回股票。

    我应该用吗? null returned value 指示操作失败,或 throwing checked exception 指示操作失败?或可能 Null Object Pattern ?为什么?


    返回值为空

    // User force to check the returned value each time.
    // This happen when, stock server is down, network is down, 
    // stockCode is not valid...
    Stock stock = stockServer.getStock(stockCode);
    if (stock != null) {
        // Success.
    }
    

    已检查异常

    try {
        // User force to catch the exception each time.
        // This happen when, stock server is down, network is down,
        // stockCode is not valid...
        Stock stock = stockServer.getStock(stockCode);
        // Success.
    } catch (StockNotFoundException ex) {
    }
    

    空对象模式

    Stock stock = stockServer.getStock(stockCode);
    // stock.getPrice(), stock.getVolume() will return 0...
    // But when there is a need to check whether we are getting
    // a null stock, we need to check 
    // if (stock.getPrice() == 0.0 && stock.getVolume()...
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   Charles Salvia    14 年前

    对于这种(主观的)设计决策,我的建议是与语言的谷粒(即尝试并遵循语言的标准库所使用的实践)。Java标准库通常倾向于错误处理的例外,而不是返回值。例如,Java Socket 类抛出一个 IOException 如果无法连接(例如网络关闭或远程地址无效)。

    另一方面,空返回值通常用于集合对象找不到指定键的情况。

    因此,我认为,在你的情况下,Java语言中的“精神”是一个例外,因为它可以指示一个严重的问题,例如网络错误。

    您也可以使用 null 返回值以指示指定的 stockCode 不存在异常,表示出现更严重的问题,如网络故障。但是,这将要求您的API用户检查空返回值 处理异常。

        2
  •  3
  •   Chris Thompson    14 年前

    我想说做个混合物。如果找不到代码,则引发错误异常(股票服务器关闭、网络关闭等),并返回空值。这与其他Java错误处理是一致的。如果没有与键相关联的值(与符号相关联的无库存不同),则集合返回空值,并且套接字在网络关闭时引发异常。注意:我清楚地使用了@charles答案中的示例。

        3
  •  1
  •   Community CDub    8 年前

    复制品 Return 'null' or throw exception .

    由于缺少股票代码不是一个错误,我建议不要抛出异常。为了不测试 null 遍布各地,实施 null object pattern 可能是个解决方案。

        4
  •  0
  •   Mario The Spoon    14 年前

    当您要查找的库存不存在时,使用返回空值;

    如果它确实是普通工作流的异常,请使用该异常。

    异常处理非常昂贵,应该只用于处理意外情况。

    高温高压

    马里奥