java对返回数据的正确处理
我有一个关于正确处理为一个项目编写的DAO库返回的问题。这个库可能会被其他人使用,我想正确地使用它。我应该如何处理DAO函数的返回语句
示例1 我有函数getCustomer,它应该返回字符串。如果查询没有返回任何结果,我应该返回null、空字符串还是引发某种异常
示例2
我有一个函数getCutomerList
,它返回ArrayList类型的值<;字符串>;。如果查询没有返回任何结果,我应该返回null、空ArrayList还是引发一些异常
示例3
检测到一些SQL异常,我应该怎么做,抛出异常还是执行try
catch
它可能发生在哪个块上
在我的案例中,“良好”实践或“最佳”实践是什么
# 1 楼答案
因为它是您的API,所以只要您保持一致并确保正确记录,任何方法都是好的
为1&;2: 不过请注意,返回null将强制客户端代码继续执行如下检查:
这就是为什么我更喜欢返回空对象或集合
对于3: 这将取决于您的API设计。但首先,不要在调用堆栈中抛出低级异常。您应该将它们包装在为您的API设计的自定义异常类中,这样您的客户机代码只需要捕获API异常,而不需要捕获各种较低级别的异常(SQLException、IOException等)
其次,您必须首先确定抛出异常是否有任何好处。抛出异常使客户端代码能够自定义如何处理其API依赖项遇到的问题。但是抛出它也会禁止作为API设计者的您设计内部意外事件,这将允许您的代码可能从问题中恢复(使您的API不那么健壮)
# 2 楼答案
示例1:由于未检索到任何内容,因此应返回null。或者,可以选择空对象模式
示例2:宁愿空ArrayList也不要null。请参阅“有效Java”第43项:返回空数组或集合,而不是null
示例3:将SQLException转换为更高的异常并抛出它。请参阅“有效Java”第61项:抛出适合于摘要的异常
# 3 楼答案
您的库似乎正在进行类似数据库的调用。如果是这样的话,那么我将完全按照JPA 2 specification实现的方式来做
我的意思是,查看JPAAPI中的
find()
方法,并准确返回它们在那里做的事情您可以在
find
中看到,我认为它类似于您的getCustomer()
方法,如果没有找到,它将返回null
,如果参数无效,则只抛出IllegalArgumentException
如果
find()
方法与getCustomer()
不接近,则应实现与getSingleResult()相同的行为:如果没有找到结果,它将抛出
EntityNotFoundException
;如果找到多个实例,它将抛出NonUniqueResultException
;如果SQL错误,它将抛出IllegalStateException
你必须决定哪种行为最适合你
这同样适用于getResultList():
getResultList()
如果找不到,则返回null;如果SQL非法,则仅引发异常通过遵循这一行为,您保持了一致性,您的用户将有一种了解库的感觉
另一种行为是返回空集合,而不是
null
。这就是Google Guava如何实现他们的API的,这也是为什么人们更喜欢这样做的原因。但是,我喜欢一致性,并且仍然认为应该实现尽可能接近standard
的库资源
Joshua Bloch made a video explaining how to design a good API and why it matters
# 4 楼答案
getCustomer()
应该返回Customer。如果它返回字符串,则可能应称为getCustomerName()
或getCustomerId()