我需要创建一个按员工姓名查找员工的方法。有三种可能的解决方案来实现这一点,如下所示:
Employee- findEmployeeById(long empId( 抛出 NoSuchEmployeeCheckedException;
- 可选 findEmployeeById(long empId(; Employee
- findEmployeeById(long empId( 抛出 NoSuchEmployeeUnCheckedException;
如果 id 在我的存储库中匹配,第一种方法将返回一个 employee 实例,否则抛出检查异常的实例NoSuchEmployeeCheckedException
第二种方法将返回java8的Optional实例,同时没有异常抛出。
最后一种方法与第一种方法类似,但抛出一个 UnCheck 异常的实例NoSuchEmployeeUnCheckedException
而不是检查异常。
我已经在StackOverFlow上阅读了多篇关于检查与未检查异常的文章。老实说,我仍然不太确定如何正确使用它们。
约书亚·布洛赫(Joshua Bloch(在《有效的Java》中说:
对可恢复条件使用检查异常,对编程错误使用运行时异常(第 2 版第 58 项(
- findEmployeeById 是可恢复的条件吗?
- 我需要使用可选还是抛出异常?
- 哪种解决方案最好?
在特殊情况下使用例外,如果通常预期找不到员工,那么您可能不应该使用例外。
异常还具有一些运行时开销,因为它们需要捕获堆栈跟踪。
在这种情况下,我会使用Optional
,或者如果多个员工可以具有相同的名称,则返回某种类型的Collection
,如果未找到员工,则使用空集合。