组织回调的首选方式是什么?[关闭]
-
02-10-2019 - |
题
在我的 Android 项目中,我定义了一些回调来对按钮单击、连接事件或 UI 事件(例如 Dilaog.onShow())进行操作。出于演示目的,我选择了必须从某些 Activity 代码启动的 Runnable 接口。通过 Java,我可以用不同的方式来表达自己。
一种模式是使用匿名类
runOnUiThread(new Runnable() {
public void run() {
doSomething();
}
});
private void doSomething() {
}
另一个 - 定义一个内部私有类,即
private DoSomething implements Runnable {
public void run() {
// do something;
}
}
...
runOnUiThread(new DoSomething());
还有一个 - 使用私有成员,如下所示:
private final Runnable doSomething = new Runnable() {
public void run() {
// do something;
}
}
...
runOnUiThread(doSomething);
这是另一个,我最喜欢它,因为一方面,除非有人真正使用它,否则它实际上不会构造对象,因为它避免了额外的类,因为它可以在需要时接受参数。
private Runnable doSomething() {
return new Runnable() {
public void run() {
// do something;
}
}
}
...
runOnUiThread(doSomething());
我不是在寻找品味或宗教信仰的论据,而是在寻找代码可维护性和性能的论据。我希望收到可以帮助我发展自己的偏好的提示和建议,可能 - 根据给定情况的不同偏好。
剧透:
Java 的进步使这个问题变得过时,请参阅已接受的答案。
解决方案 5
其他提示
我不相信有任何惯用的方法来处理回调。
我通常首先内联一个匿名类。当方法变得太大时,我将类创建提取到一个单独的函数中。当类变得太大时,我将其提取到自己的文件中。
如果您使用像 Eclipse 这样的 IDE,您可以自动、安全地执行所有这些重构。
像@Manuel Silva 和@Toby Champion 一样,我不喜欢匿名内部类。它们有点难以阅读,不是很“OO”,因为它们不能扩展,不能有 DIP、setter 或任何可以调整行为的东西等等......,而且它们常常最终违反 DRY 原则当您在 27 个不同的地方添加相同的代码时。
我倾向于使用私有成员(您的选项 #3),或通常名为 getAsRunnable() 的私有函数(您的第四种风格)。
我对 Android 很陌生,但是匿名类让我感到恶心,而且看来你还有 runOnUiThread 的替代方案:AsyncTask,在这里讨论:runOnUIThread 问题
从我的角度来看,匿名类确实降低了可读性。由于 Ui 代码通常非常冗长,因此为每个按钮添加匿名回调可能会导致类变得非常大。因此,我使用内部私人课程。