使用Runnable作为回调/子程序的不良做法?

时间:2014-03-28 21:35:32

标签: java callback runnable

使用Runnable作为回调是否被视为不良做法?

考虑到Runnable意味着与线程一起使用(请参阅它的JavaDoc),我想知道这是否正常 - 或者我是否应该为此目的创建自己的接口。

我所说的是:

public class KeyBinding {
    public KeyBinding(KeyStroke stroke, Runnable handler) {
        //...
    }
}

2 个答案:

答案 0 :(得分:18)

不要将Runnable用作回调;它可能会引起混淆:人和代码质量工具有时会期望它只与线程一起使用。

我自己使用Runnable作为回调 - 我认为它似乎非常适合用作通用回调。一个月后,有人发现我的代码被剪掉了:

doneCallback.run();

并且他注意到doneCallbackRunnable,并且直接调用.run()会在我们的代码质量分析程序(Sonar)中发出警告。那么,为了修复警告?或者因为他认为意图是创建一个线程?,他分叉了一个新线程,并通过该线程调用run()

然而,在那里分叉,打破了东西。

为避免混淆,现在我改为创建一个与线程无关的通用回调接口。我只是使用方法Callback添加了一个类call。我想我最好不要使用java.util.concurrent.Callback,因为那个也与线程有关。

答案 1 :(得分:6)

实际上,Runnables可以用于任何目的。

“方法运行的一般合同是它可以采取任何行动”(Runnable javadoc

一般来说,这不应该是不好的做法,绝对比在自己的代码中创建额外的不必要的接口更好。