2010-09-15 182 views
4

在我的Android项目中,我定义了几个回调来操作按钮点击,连接事件或UI事件,如Dilaog.onShow()。为了演示目的,我选择了一个Runnable接口,它必须从某些Activity代码启动。用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); 

这是另一个,我最喜欢的,因为一方面它并不实际构造o除非有人真的使用它,因为它避免了额外的类,因为如果需要它可以采用参数。

private Runnable doSomething() { 
    return new Runnable() { 
     public void run() { 
      // do something; 
     } 
    } 
} 
... 
runOnUiThread(doSomething()); 

我不是在寻找品味或宗教信仰的观点,而是代码可维护性和性能。我希望收到一些提示和建议,这些提示和建议可以帮助我发展自己的偏好,可能会根据特定的情况制定不同的偏好。

剧透:

Java的进展已使这个问题已经过时,见接受的答案。

+1

相关:[这是\ [代码质量]的结尾吗?](http://meta.stackoverflow.com/q/313767/4639281)。如果您可以编辑这个问题,以不基于意见的方式对其进行标记,并删除[tag:code-quality]标签,那么我将收回我的近距离投票(如果它再次关闭,则投票重新打开)。 – 2016-01-07 01:38:44

+0

对不起,我不知道这个有问题的标签。 – 2016-01-07 04:51:55

+0

你的问题仍然有过分基于意见的措辞。我相信它可以被编辑为不是这样,但这取决于你。 – 2016-01-07 04:53:31

回答

0

今天,当Java的8几乎可用于Android,而Android工作室automagically假装lambda表达式已经被支持,匿名类(#1)解决方案似乎是显而易见的选择:

collapsed

expanded

0

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

+0

谢谢,我已经修复了第一个例子来更好地表达这个想法:在我的例子中匿名回调只是调用一个私有方法,不太可能是两个。 – 2010-09-16 09:38:29

1

我很新到Android,但匿名类让我想吐,似乎你已经替代反正runOnUiThread:的AsyncTask,这里讨论: runOnUIThread question

+0

感谢您的指针 – 2012-01-09 02:46:41

2

我不相信有任何地道处理回调的方式。

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

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

2

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

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

相关问题