使用 Runnable 作为回调/子程序的坏习惯?
Posted
技术标签:
【中文标题】使用 Runnable 作为回调/子程序的坏习惯?【英文标题】:Bad practice to use Runnable as callback / subroutine? 【发布时间】:2014-05-08 13:12:43 【问题描述】:使用Runnable
作为回调是否被认为是不好的做法?
考虑到Runnable
旨在与线程一起使用(请参阅它的 JavaDoc),我想知道这是否可以 - 或者我是否应该为此创建自己的接口。
我说的是这样的:
public class KeyBinding
public KeyBinding(KeyStroke stroke, Runnable handler)
//...
【问题讨论】:
【参考方案1】:不要使用 Runnable 作为回调;它可能会引起混淆:人们和代码质量工具有时希望它只用于线程。
我自己确实使用过 Runnable 作为回调——我认为它似乎非常适合用作通用回调。一个月后有人发现我的代码被剪掉了:
doneCallback.run();
他注意到doneCallback
是Runnable
,而直接调用.run()
会导致我们的代码质量分析程序(Sonar)中出现警告。所以,为了修复警告?还是因为他认为意图是创建一个线程?他分叉了一个新线程,并通过该线程调用了run()
。
但是,在那里分叉一个线程,破坏了一些东西。
为了避免混淆,现在我创建了一个与线程无关的通用回调接口。我只是用方法call
添加一个类Callback
。我想我最好不要使用java.util.concurrent.Callback
,因为它也与线程有关。
【讨论】:
这真的很有帮助!非常感谢^^【参考方案2】:实际上,Runnables 可以用于任何目的。
“方法运行的一般约定是它可以采取任何行动”(Runnable javadoc)
一般来说,这应该不是不好的做法,绝对比在自己的代码中创建额外的不必要的接口更好。
【讨论】:
另一方面,查看您提供的文档链接,它显示The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread.
因此,正如 KajMagnus 所经历的那样,人们可能期望 Runnable 与线程相关联,并发现这种用法令人困惑。我同意 KajMagnus 的观点,即定义特定于这种用法的接口更加清晰。
其实,它总是关联着一个线程,主线程!以上是关于使用 Runnable 作为回调/子程序的坏习惯?的主要内容,如果未能解决你的问题,请参考以下文章