【问题标题】:What is the preferred way to organize callbacks? [closed]组织回调的首选方式是什么? [关闭]
【发布时间】:2010-09-15 14:45:34
【问题描述】:

在我的 Android 项目中,我定义了一些回调来操作按钮点击、连接事件或 UI 事件,例如 Dilaog.onShow()。出于演示目的,我选择了一个必须从一些 Activity 代码启动的 Runnable 接口。使用 Java,我有不同的方式来表达自己。

一种模式是使用匿名类

runOnUiThread(new Runnable() { 
    public void run() { 
        doSomething(); 
    }
});

private void doSomething() {
}

another - 定义一个内部私有类,即

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 的进步使这个问题已经过时,请参阅接受的答案。

【问题讨论】:

  • 相关:Is this the end of [code quality]?。如果您可以编辑此问题以使其不是基于意见的措辞,并删除code-quality 标签,那么我将撤回我的关闭投票(或者如果再次关闭,则投票重新打开)。
  • 抱歉,我不知道这个有问题的标签。
  • 您的问题仍然有过于基于意见的措辞。我确信它可以被编辑为不是这样,但这取决于你。
  • 让我想想
  • 没问题,如果您认为不再如此,请联系我。

标签: java lambda coding-style anonymous-class private-class


【解决方案1】:

我不相信有任何惯用的方法来处理回调。

我通常首先内联一个匿名类。当方法变得太大时,我将类创建提取到一个单独的函数中。当类变得太大时,我会提取到它自己的文件中。

如果您使用 Eclipse 之类的 IDE,您可以自动安全地执行所有这些重构。

【讨论】:

    【解决方案2】:

    像@Manuel Silva 和@Toby Champion 一样,我不喜欢匿名的内部类。它们有点难以阅读,不是很“OO”,因为它们不能扩展,不能有 DIP、setter 或任何调整行为的东西,等等……而且它们往往最终违反了 DRY 原则当你在 27 个不同的地方添加相同的代码时。

    我倾向于使用私有成员(您的选项 #3),或通常命名为 getAsRunnable() 的私有函数(您的第 4 种样式)。

    【讨论】:

      【解决方案3】:

      我对 Android 很陌生,但是匿名类让我感到恶心,而且似乎你还有一个 runOnUiThread 的替代方案:AsyncTask,在此讨论: runOnUIThread question

      【讨论】:

        【解决方案4】:

        在我看来,匿名类确实降低了可读性。因为 Ui 代码通常非常冗长,为每个按钮添加匿名回调可能会导致非常大的类。因此,我使用的是内部私有类。

        【讨论】:

        • 谢谢,我已经修正了第一个例子来更好地表达这个想法:在我的例子中,匿名回调只是调用了一个私有方法,不太可能是两个。
        【解决方案5】:

        今天,当 Java 8 几乎可用于 Android 并且 Android Studio automagically 假装已经支持 lambdas 时,匿名类 (#1) 解决方案似乎是显而易见的选择:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-30
          • 1970-01-01
          • 1970-01-01
          • 2017-08-30
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多