想象一下简单的银行应用程序,其中正在实现资金转移的用例。在编写转移基金操作时,程序员/设计师有以下两个选项
编写一个操作以检查是否有足够的资金并返回一个布尔值,根据该布尔值执行后续的资金转移选项。这需要创建两个功能即。 checkSufficientFunds()和transferFund()
编写一个单独的操作,检查资金是否充足。如果没有足够的资金并且调用方法必须处理这个问题,这将抛出一个已检查的异常。
我知道这是一个过于简化的场景。我的问题是,从理论上讲,这两种方法的性能影响(内存和CPU)是什么?他们如何比较?
答案 0 :(得分:1)
当前JVM的性能差异应该可以忽略不计。但是,坚持在特殊情况下应该使用例外的规则。没有足够的资金是正常流程,所以我会使用方法public boolean transferFund()
如果成功则返回true
,否则返回false
。这个建议违反了command/query separation,但我认为没问题。
答案 1 :(得分:0)
性能影响不太可能让人担心。但是,我仍然建议在异常情况下使用Exception。在这种情况下,您不需要两种方法。你可以
boolean transferred = transferFundsIfAvailable( ... );
使用两种方法的原因是不可取的,即它可能会导致竞争条件,即使各个方法都是线程安全的。说你有
if(checkSufficientFunds()) {
// another thread transfers funds
transferFund(); // but there is not enough any more
}
你也可以先忘记给支票打电话。没有它你会好起来的。
答案 2 :(得分:0)
在运行时,try-catch块不会显着影响性能。只有在发生异常时,无论如何都必须处理异常。但是,只有在需要时才会使用例外(当应用程序无法正常出现时)。
答案 3 :(得分:0)
这项任务更多地是关于原子操作。在第一种情况下,可以透支帐户,而在第二种情况下,您可以回滚(或应该)。
在性能方面,任何时候生成消耗内存和时间的堆栈跟踪。 Iirc它使执行路径更加昂贵。
答案 4 :(得分:0)
如果我正在进行代码审查,并且有人通过性能考虑因素选择使用异常与方法调用之间的选择,那么我会低估那个开发人员。这是一个关于次优化和浪费时间的教科书案例。优化重要的地方并产生可衡量的影响。不要以代码质量和稳健性为代价削减毫秒数。
对于这种情况 - 有些人喜欢使用异常作为流量控制机制。我不。在我看来,例外用于表示达到意外状态。通常,这类似于错误。检查的异常意味着状态是可以想象地从当前事务或转换的范围内恢复的状态。未经检查的异常意味着没有可靠的恢复,系统应该提醒用户。