组织回调的首选方法是什么?

时间:2010-09-15 14:45:34

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

在我的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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

就像@Manuel Silva和@Toby Champion一样,我不喜欢匿名的内部课程。它们有点难以阅读,不是非常“OO”,因为它们无法扩展,不能有DIP,setter或其他任何调整行为等等......而且它们经常最终违反DRY原则当您在27个不同的地方添加相同的代码时。

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

答案 2 :(得分:1)

我对Android很陌生,但匿名类让我感到恶心,无论如何你似乎还是runOnUiThread的替代品:AsyncTask,在这里讨论: runOnUIThread question

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

collapsed

expanded