我是一名 C++ 开发人员,我对 Java 中的已检查和未检查异常非常陌生。 c++ 中的异常规范根本不好,这就是为什么没有人使用它的原因。我喜欢检查异常,我有一个问题,让我们有这个接口(interface):
public interface Warehouse {
MyStuff fetch(int id);
}
仓库可以以不同的方式实现:文件、数据库或内存(用于测试的模拟对象)。
现在,如果我想使用一个文件来实现,我不能尝试在方法中打开文件,否则我的签名将改变并且我的类将不再实现该接口(interface)。另外,如果我有另一个带有另一个已检查异常的类,所有其他现有实现都将受到影响。
我可以看到两种解决方案:
捕获检查异常并抛出另一个自定义运行时异常。我不认为这是一个很好的解决方案,为什么用户应该捕获一个运行时异常,说一个文件丢失,而已经有一个标准的和经过检查的方法来做到这一点。
在实现类的构造函数中完成所有工作,并让 fetch 函数无法抛出。我喜欢这种方式,对象要么存在且有效,要么不存在。这种方法的唯一缺点是我们无法实现惰性求值;我们需要在构造函数中读取和解析文件,即使没有人会使用该对象。这效率不高。
我错过了什么吗?有没有更好的方法来避免这个问题?
最佳答案
您的第一个解决方案是正确的。将您的界面更改为:
public interface Warehouse {
MyStuff fetch(int id) throws FetchFailureException;
}
并让每个子类将其 IO、JDBC 或任何异常包装在 FetchFailureException 中。如果不可恢复,则此 FetchFailureException 异常应为运行时异常,并检查是否可恢复。
关于java - 检查异常规范和策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8589190/