【问题标题】:Handle an event: implement an interface or using inner class to handle the interface. Which is better处理事件:实现接口或使用内部类处理接口。哪个更好
【发布时间】:2012-09-02 18:07:25
【问题描述】:

处理一个事件,有两种方式:

  1. 实现回调接口,例如

    public class A implements View.OnClickListener {
        public void onClick(View v) {
            ....
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout);
            aboutLayout.setOnClickListener(this);
        }
    }
    
  2. 创建实现回调接口的内部类

    public class ActivityAbout  {
        private class ViewClickListener implements View.OnClickListener {
            public void onClick(View v) {
                ..
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            ViewClickListener listener = new ViewClickListener();
            aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout);
            aboutLayout.setOnClickListener(listener);
        }
    }
    

哪个更好?

【问题讨论】:

    标签: java android oop


    【解决方案1】:

    选择完全取决于你计划使用类的方式,每个方法都是有效的,并且有其相应的优点和缺点:

    • 方法 1 可以快速编写代码,但将您限制为一个 onClick() 函数,这可能会或可能不会成为组织混乱。
    • 方法 2 允许您创建多个 onClick() 函数,并以更合乎逻辑的方法使用它们。

    但是我想介绍方法3,一个匿名回调:

    public class MyActivity extends Activity {
        OnClickListener myClickListener1 = new OnClickListener() {
            public void onClick(View v) {
                ..
            }
        }
    
        OnClickListener myClickListener2 = new OnClickListener() {...}
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            view.setOnClickListener(myClickListener1);
        }
    }
    

    请注意,与方法 2 不同,我没有创建自定义类。除非您要添加更多功能、保留局部变量或以其他方式修改 OnClickListener 的基本功能,否则我会避免创建新的自定义类。

    【讨论】:

      【解决方案2】:

      如果代码很长(并且需要组织或方法化),或者如果我打算一遍又一遍地使用相同的代码,我倾向于使用内部类。为了清楚起见,甚至我的 Surface 回调也被组织为内部类。

      如果代码简短且易于处理(可能只是事件中的一行),我会使用匿名类。

      在事件与类本身直接相关的情况下使用第一个实现,并且永远不需要附加其他侦听器。这是一种非常罕见的情况。 (我也用它来进行简单的调试,但这在这里无关紧要。)

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 2011-11-11
        • 2010-11-26
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        相关资源
        最近更新 更多