我有很多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