我有很多Java接口只有一个主要实现(不包括模拟和存根)。清理在接口中声明但在实现中不抛出的异常
随着时间的推移,接口及其实现将会发展,包括某些方法抛出的异常。
问题是,当我们在实现中添加一个异常时,编译器提醒我们在接口上添加异常。但是当实现不再抛出异常时,会有警告提醒我们去除实现上的异常声明,但我们经常忘记将其从界面中移除。
所以我们最终在接口的客户端代码中处理了从未实际抛出的异常。
步骤1,我们在执行一个例外,它是向上传播链:
interface Service {
void doSomething() throws MyException;
}
class ServiceImpl implements Service {
void doSomething() throws MyException {
if (dummyCondition) {
throw new MyException("oops");
}
System.out.println("hello world");
}
}
class Client {
@Inject Service service;
void clientCode() {
try {
service.doSomething();
} catch(MyException e) {
logger.error("oops", e);
}
}
}
步骤2,异常不是由实现了抛出,但我们忘了拿干净的界面,所以不知道该抓不适用了:
interface Service {
void doSomething() throws MyException;
}
class ServiceImpl implements Service {
void doSomething() {
if (dummyCondition) {
logger.warning("actually, don't throw, just log 'oops'");
}
System.out.println("hello world");
}
}
class Client {
@Inject Service service;
void clientCode() {
try {
service.doSomething();
} catch(MyException e) {
logger.error("oops", e); // we'll never get there.
}
}
}
理想情况下,我想说什么“异常宣告但尚未通过任何已知的实现抛出”界面上的警告。
有没有办法在Eclipse或源代码分析工具中检测那些声明但从不抛出的异常,以便能够进行一些清理?
当您执行外部客户端将使用的API时,最好将所有Exceptions声明为RuntimeException。 – RamonBoza
您是否应该实现一个接口,而不是更新接口作为实现更改的结果? –
这并不意味着被外部客户使用。这只是我的项目的内部。我声明了一个接口,以便在不同时测试实现代码的情况下更容易地测试接口的客户端(这是同一产品中的其他类)。 – Xavier