使用Runnable
作为回调是否被视为不良做法?
考虑到Runnable
意味着与线程一起使用(请参阅它的JavaDoc),我想知道这是否正常 - 或者我是否应该为此目的创建自己的接口。
我所说的是:
public class KeyBinding {
public KeyBinding(KeyStroke stroke, Runnable handler) {
//...
}
}
答案 0 :(得分:18)
不要将Runnable用作回调;它可能会引起混淆:人和代码质量工具有时会期望它只与线程一起使用。
我自己使用Runnable作为回调 - 我认为它似乎非常适合用作通用回调。一个月后,有人发现我的代码被剪掉了:
doneCallback.run();
并且他注意到doneCallback
是Runnable
,并且直接调用.run()
会在我们的代码质量分析程序(Sonar)中发出警告。那么,为了修复警告?或者因为他认为意图是创建一个线程?,他分叉了一个新线程,并通过该线程调用run()
。
然而,在那里分叉,打破了东西。
为避免混淆,现在我改为创建一个与线程无关的通用回调接口。我只是使用方法Callback
添加了一个类call
。我想我最好不要使用java.util.concurrent.Callback
,因为那个也与线程有关。
答案 1 :(得分:6)
实际上,Runnables可以用于任何目的。
“方法运行的一般合同是它可以采取任何行动”(Runnable javadoc)
一般来说,这不应该是不好的做法,绝对比在自己的代码中创建额外的不必要的接口更好。