使用 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();

他注意到doneCallbackRunnable,而直接调用.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 作为回调/子程序的坏习惯?的主要内容,如果未能解决你的问题,请参考以下文章

Python重音坟墓的坏习惯?

刷新认知!这六种让 Python 程序变慢的坏习惯我一直在用

严重影响电脑反应速度的坏习惯有哪些?

IT程序员的坏习惯有哪些?你中了吗?纯个人观点,不喜绕道

独家 | 6种让Python程序变慢的坏习惯

阅读思考——被误用的敏捷和阻碍程序员成长的坏习惯