2012-08-02 42 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

相关问题