java - 检查异常规范和策略模式

标签 java exception

我是一名 C++ 开发人员,我对 Java 中的已检查和未检查异常非常陌生。 c++ 中的异常规范根本不好,这就是为什么没有人使用它的原因。我喜欢检查异常,我有一个问题,让我们有这个接口(interface):

public interface Warehouse {
   MyStuff fetch(int id);
}

仓库可以以不同的方式实现:文件、数据库或内存(用于测试的模拟对象)。

现在,如果我想使用一个文件来实现,我不能尝试在方法中打开文件,否则我的签名将改变并且我的类将不再实现该接口(interface)。另外,如果我有另一个带有另一个已检查异常的类,所有其他现有实现都将受到影响。

我可以看到两种解决方案:

  1. 捕获检查异常并抛出另一个自定义运行时异常。我不认为这是一个很好的解决方案,为什么用户应该捕获一个运行时异常,说一个文件丢失,而已经有一个标准的和经过检查的方法来做到这一点。

  2. 在实现类的构造函数中完成所有工作,并让 fetch 函数无法抛出。我喜欢这种方式,对象要么存在且有效,要么不存在。这种方法的唯一缺点是我们无法实现惰性求值;我们需要在构造函数中读取和解析文件,即使没有人会使用该对象。这效率不高。

我错过了什么吗?有没有更好的方法来避免这个问题?

最佳答案

您的第一个解决方案是正确的。将您的界面更改为:

public interface Warehouse {
    MyStuff fetch(int id) throws FetchFailureException;
}

并让每个子类将其 IO、JDBC 或任何异常包装在 FetchFailureException 中。如果不可恢复,则此 FetchFailureException 异常应为运行时异常,并检查是否可恢复。

关于java - 检查异常规范和策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8589190/

相关文章:

java - 通过 csv 文件 Java 存储值的最佳结构

java - 2009 年 Ruby on Rails 与 Java 的开发生产力

perl - 如何在 Perl 中创建和抛出异常?

c# - WPF,带有错误和警告消息的句柄

java - 将 JSON 数据转换为一组 Java 对象

java - 当我使用 Java API 从插件打印时,IBM Rhapsody 日志为空

java - 在java中将实数隔离在复数中

java - 有效地使用 UncaughtExceptionHandler

java - 相应的 try block 中永远不会抛出异常

c++ - 无法使用 MySQL Connector/C++ : exception thrown 从 C++ 程序连接到 MySQL 数据库