2012-08-02 68 views
2

我知道Java通常不會關心返回的對象(如果存在於方法中),但在這種情況下,我想確保Api的用戶將返回的實例添加到列表,否則會立即執行。忽略返回對象時的編譯時間警告

普通的Java:

Runnable someTask() { 
    ... 
} 

someTask(); // ok 

應該

Runnable someTask() { 
    ... 
} 

addToExecutionList(someTask()); // ok 
someTask(); // gives warning 

是否有辦法防止這種情況與說一個編譯時警告?

回答

4

有沒有一種方法來防止這種情況,比如編譯時警告?

不可以。強制調用者無法使用方法的返回值。像FindBugs這樣的東西可能會有一個選項,可以將其報告爲狡猾的代碼,如果這對您有幫助。

+0

嗯...你能想到一個運行時解決方案嗎? – Theodor 2012-08-02 14:14:19

+1

@Theodor:不是。我正在考慮一個終結者的東西,但那會是*真的*哈克,並不總是合適的。 – 2012-08-02 14:18:30

+0

不,我同意應該避免在API中使用hacky解決方案。謝謝。 – Theodor 2012-08-02 14:27:48

2

編譯時間警告僅適用於最常見的錯誤。忽略返回值是正常的做法。

你可以使用的是靜態分析工具,比如find bugs,checkstyle或IntelliJ的靜態分析。

2

您可以將參數添加到someTask,讓someTask照顧將自身添加到列表:

void someTask(List<Runnable> executionList) { 
    // ... 
    executionList.add(task); 
} 

當然不過,這不會從傳遞廢話列表,該方法避免。

如果你想確保,將可運行是總是加入到一個非常特殊的名單,那麼你應該改變的API,以便用戶將不能夠調用someTask但會看到某種「工廠「創建任務將其添加到該列表。這應該是內部的,所以沒有人可以從該列表中刪除新創建的任務(以此類推;))

+0

第一個解決方案可以實現爲'AbstractTask','列表 executionList'作爲構造函數參數,'executionList.add(this)'在其構造函數中,並且可以在運行時檢查無意義列表,可能無法捕獲所有的錯誤,但一些。 – Theodor 2012-08-02 14:54:13

相關問題