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

时间:2014-03-14 22:51:37

标签: java android event-handling anonymous-inner-class

我最近进入Android并且一直在查看关于内部类的示例,但是并不真正了解它们的用途。在制作听众时经常使用它们,而在制作全班时是不必要的吗?也许有人可以用非专业术语向我解释,在这种情况下使用内部匿名类的替代方案是什么? 这段代码:

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

            }
        });

由于

3 个答案:

答案 0 :(得分:4)

另一种替代模式是使容器类本身成为一个监听器。

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对象的内容以确定单击了哪个按钮或将构造函数参数传递给侦听器类以更改侦听器行为等。

答案 1 :(得分:0)

  

在制作听众时经常使用它们,而在制作完整的课程时是不必要的吗?

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

  

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

创建一个实现此接口的类并将其作为参数提交。例如:

public class MyListener
    implements View.OnClickListener
{
    // implement onClick(), etc etc
}

// In code:

button.setOnClickListener(new MyListener(...));

答案 2 :(得分:0)

这非常简单:你所做的只是创建一个类。对于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的逻辑分离。因此,您使用匿名类,因为所有代码都保留在一个位置并使其具有良好的可读性。