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

使用Runnable作为回调被认为是不好的做法吗?

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

我所说的是:

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

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

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

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

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

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

 doneCallback.run(); 

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

然而,在那里分叉一个线程,打破了东西。

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