2017-08-08 87 views
0

我需要创建一个方法来按员工姓名查找员工。有三种可能的解决方案来执行此操作,如下所示:返回java.util.Optional或抛出(Checked/Unchecked)异常

  1. 员工findEmployeeById(long empId)抛出NoSuchEmployeeCheckedException;
  2. 可选findEmployeeById(long empId);
  3. 员工findEmployeeById(long empId)抛出NoSuchEmployeeUnCheckedException;

如果ID在我的仓库匹配的第一个方法将返回Employee的一个实例,否则抛出检查异常NoSuchEmployeeCheckedException

第二种方法将返回java8的可选实例的实例,而没有异常抛出。

最后一种方法与第一种方法类似,但抛出UnCheck异常的实例NoSuchEmployeeUnCheckedException而不是检查异常。

我已经阅读了StackOverFlow关于检查与未检查的异常的多个帖子。我仍然不确定如何正确使用它们。

约书亚布洛赫在“有效的Java”说,

使用检查可恢复条件和运行时异常的编程错误(第58项中的第2版)

  1. 是在findEmployeeById可恢复条件异常?
  2. 我需要使用Optional还是抛出异常?
  3. 哪个解决方案最好?
+0

以上都不是,返回Employee列表。该查询可以返回多行,因为多个员工可以具有相同的名称。如果没有匹配返回空列表 –

+0

不需要考虑实际的逻辑 –

回答

0

在特殊情况下使用例外情况,如果通常预计没有员工被发现,那么您可能不应使用例外情况。
异常还需要一些运行时开销,因为它们需要捕获堆栈跟踪。
在这种情况下,我将使用Optional或者多个员工可以使用相同名称,返回某种类型的Collection,如果找不到员工,则使用空集合。