重新思考具有 null/empty 处理场景的设计模式
像下面这样的函数
function(customerid){
customer=findcustomerbyId(customerid)-->findcustomer
list<Transactions> accounts=getNewTransactions(customer)-->findtransactions
foreach{if(transaction.isGasTransaction()){send(event)..if()sendevent()}}-->send events
}
现在的问题是,每当我们期望函数返回值时,它应该是空值吗?或者如果数据库找不到值,它应该抛出异常。
抛出空值会迫使您编写代码来处理空值/空列表。这将增加 if-else block ,并且您的 junit 案例也会增加(成正比)。抛出异常将迫使您采用不同的编程风格,并且您再次需要一些期待异常的测试用例。
像 spring-jdbc 模板一样,如果 db 中没有值,queryForObject 会抛出异常。(expected-1 但得到 0)
这里的正确方向是什么?更多异常(exception)?或者像其他 null 替代品一样使用 Optionsl<>java-8 或使用 null?
我们可以在不同的场景中平衡这些风格:)
所以对于rest-api项目我认为抛出异常会很好,如果你有全局异常处理程序(如 Controller 建议)原因,你可以处理代码中的异常而不用担心方法堆栈处理空检查/空检查,因为在建议级别捕获异常并相应地传播。
***这是朝着一个方向思考而不是讨论哪个最好*****
最佳答案
问问自己“当有人尝试访问不存在的条目时我希望发生什么?”
如果您想向用户显示消息,您可以抛出一个已处理的Exception
来通知上一级发生了问题,从而允许您显示catch
block 中的某种错误消息。
如果您不想发生任何事情,请使用 null 对象,这样您的线程就不会崩溃。用户不会被告知为什么没有发生任何事情,这被认为是不好的做法。
如果缺少条目导致程序无法正常运行,则会使用运行时
异常。 NullPointerException
未详细说明。 NPE 可能是由于忘记初始化变量(在现代语言中通常在编译时捕获)而不是访问某种不存在的数据结构中的元素(通常导致 NoSuchElementException
现代语言),因此最好将 NPE 包装在另一个异常中,其中包含有关问题的更多信息。
关于java null/empty-list 返回与代码中抛出异常重新思考其余世界的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37755663/