为什么要使用匿名内部类,有哪些替代方法



我最近进入Android,一直在看关于内部类的例子,但不太明白它们的用途是什么。它们通常在创建侦听器和不需要创建整个类时使用,对吗?也许有人可以用外行的术语向我解释一下,在这种情况下使用内部匿名类的替代方案是什么?这段代码:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });

谢谢

另一个模式是使容器类本身成为侦听器。

public class MyClass implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button is clicked
    }
    public void initOrSomething() {
        button.setOnClickListener(this);
    }
}

但是,如果您有多个需要不同行为的按钮,则可能会遇到麻烦。

另一种方法是为每个按钮设置不同的侦听器类

public class Button1Listener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button1 is clicked
    }
}
public class Button2Listener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button2 is clicked
    }
}

button1.setOnClickListener(new Button1Listener());
button2.setOnClickListener(new Button2Listener());

匿名内部类只是第二种模式的更紧凑的表示。

编辑:这两种模式的变化都是可能的,其中检查View对象的内容以确定单击了哪个按钮,或者将构造函数参数传递给侦听器类以更改侦听器行为等。

它们通常在创建侦听器和不需要创建整个类时使用,对吗?

Android中的监听器,或其他情况下的其他接口。但本质上,就是这样。

在这种情况下,使用内部匿名类的替代方法是什么?

应该是创建一个实现这个接口的类,并将其作为参数提交。例如:

public class MyListener
    implements View.OnClickListener
{
    // implement onClick(), etc etc
}
// In code:
button.setOnClickListener(new MyListener(...));

这很简单:您所做的只是创建一个类。对于JVM(本例中是dalvik),类是它自己的编译单元(文件)、内部类还是匿名类(*)都无关紧要。所以你有三个同样有效的选项:

选项1您的示例:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    }
});

选项2命名内部类:

public MyActivity extends Activity {
 static class MyListener implements View.OnClickListener {
   @Override 
   public void onClick(View v) {
    // do something 
   }
}
....
  button.setOnClickListener(new MyListener());
}

选项3不同文件:

文件MyListener.java

public class MyListener implements View.OnClickListener {
 @Override 
 public void onClick(View v) {
  // do something 
 }
}
文件MyActivity.java

import MyListener.java
public MyActivity extends Activity {
....
  button.setOnClickListener(new MyListener());
}

你使用哪一个选项完全是主观的——取决于你的需要和用法,其中一个更有意义。然而,通常在UI监听器中,你不希望有任何逻辑与你正在编程的Activity的逻辑脱节。因此,您使用匿名类,因为所有代码都保存在一个地方,使其具有良好的可读性。

最新更新