为什么在Android中我应该使用匿名类而不是类重定义?

7

我是Android开发的新手。我读了一些相关书籍,所有的作者都强烈建议使用匿名类而不是类的重新定义。

他们说:

TextView txtTitle;
...
txtTitle.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {

   }
});

比...更好
   txtTitle.setOnClickListener(new MyOnClickListener(position));
   ...

private class MyOnClickListener implements OnClickListener{
...
}

有人能解释一下吗?为什么会这样?

当然,如果我要对许多不同的对象使用重定义类,那么修改将会成为问题。

但是,如果我只为特定对象使用自己的类,那么我的类的逻辑就不会发生很大的变化,我可以使用它吗?还是应该使用匿名类?


2
没有特别的原因,只是避免增加类的数量,并且匿名类的作用域使您可以访问包含类的内容。 - njzk2
但是我的MyOnClickListener也可以访问所有变量=/ - Suvitruf - Andrei Apanasik
@njzk2,恰恰相反,当您使用新的OnClickListener时,您实际上创建了一个新类,请尝试在某个类中执行5次并查看编译器输出文件夹中的5个内部类。 - pskink
@pskink:我的表述不正确。我的意思是它避免了创建多个Java文件,这对于组织来说可能不好,尤其是当它们非常专业化时。当然,在适用的情况下,我完全支持因式分解。 - njzk2
2个回答

11

匿名类将可以访问最终的外部变量,因此使用它可能更方便。例如:

 final String x = "123";
 Button button = (Button) findViewById(R.id.button);
 button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
                 // You can acces "x" here.
        }
 });

此外,这关乎代码风格的问题。使用匿名类可能会导致代码变得更冗长,但同时也稍微容易一些。

而且,非匿名类可以在多个地方实例化。


但在这个例子中,我可以在构造函数中将x发送到我的类。 私有类MyOnClickListener实现OnClickListener{ ... public MyOnClickListener(String x){} }但好的,我理解这是编码风格的问题,谢谢(: - Suvitruf - Andrei Apanasik
@Suvitruf - 很遗憾,你不能这样做。你确定不能把它设为final吗? - kamituel
或者你可以将它作为实例成员。 - njzk2
在这种情况下,访问我的类的“上下文”的正确方法是什么?比如我想创建一个Toast,需要添加我的类的上下文。在匿名类中,我无法访问它。 - Adrian Jandl
1
@AdrianJandl - 你可以使用MyActivity.this来访问外部类的this - 假设你的外部类叫做MyActivity - kamituel
显示剩余3条评论

3
为什么不要在Activity类中实现OnClickListener接口?
class MyActivity extends Activity implements OnClickListener

我需要在我的适配器中添加监听器:public class WorkshopListAdapter extends BaseAdapter{...},以便在列表项上挂载。 - Suvitruf - Andrei Apanasik
1
因此,让 WorkshopListAdapter 实现 OnClickListener。 - pskink
但是如果我想要在 ListItem 中仅对 1 个元素使用 onClickListener,那么在适配器上使用监听器是否正确? - Suvitruf - Andrei Apanasik
然后,Adapter 上的 onClickListener 将监听列表项上的所有事件。嗯,我认为这是多余的。 - Suvitruf - Andrei Apanasik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接