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

Java 组织回调的首选方法是什么?,java,lambda,coding-style,anonymous-class,private-class,Java,Lambda,Coding Style,Anonymous Class,Private Class,在我的Android项目中,我定义了一些回调来操作按钮点击、连接事件或UI事件,如Dilaog.onShow()。出于演示目的,我选择了一个必须从某些活动代码启动的可运行接口。使用Java,我有不同的表达方式 一种模式是使用匿名类 runOnUiThread(new Runnable() { public void run() { doSomething(); } }); private void doSomething() { } 另一个-定义内部私有

在我的Android项目中,我定义了一些回调来操作按钮点击、连接事件或UI事件,如Dilaog.onShow()。出于演示目的,我选择了一个必须从某些活动代码启动的可运行接口。使用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的进步使这个问题变得过时了,请参见公认的答案。

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

我对Android非常陌生,但匿名类让我感到恶心,而且你似乎有了runOnUiThread的替代品:AsyncTask,在这里讨论:
我不相信有任何惯用的方法来处理回调

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


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

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


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

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


谢谢,为了更好地表达这个想法,我修复了第一个示例:在我的例子中,匿名回调只调用一个私有方法,不太可能调用两个。相关:。如果您可以编辑此问题,使其以非基于意见的方式表达,并删除标记,则我将撤回我的关闭投票(或在再次关闭时投票重新打开)。抱歉,我不知道此有问题的标记。您的问题仍然有过度基于意见的措辞。我相信它可以被编辑成不这样,但这取决于你。让我想想。没问题,如果你认为它不再是这样,请告诉我。