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

2022-09-03 17:43:59

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

考虑到这是为了与线程一起使用(参见它是JavaDoc),我想知道这是否可行 - 或者我是否应该为此目的制作自己的接口。Runnable

我说的是这样的:

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

答案 1

不要使用Runnable作为回调;它可能会引起混淆:人们和代码质量工具有时希望它仅用于线程。

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

doneCallback.run();

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

然而,在那里分叉一根线,破坏了东西。

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


答案 2

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

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

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


推荐