自从我沉迷于Java之后已经有几年了。回到过去,我看到了这种模式:
ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
// do work
}
});
这看起来更像是函数式编程。这是一个很好的模式但是如何传递这样的方法呢?在过去,一个班级是一个班级,一旦编成,你就无法做到这一点。
我的问题是:
感谢。
答案 0 :(得分:9)
这会传递一个匿名类,而不是一个方法。
这是一个典型的模式,不仅仅是在Swing编程中,而是在你需要(希望)简短的任何地方,一个不需要重复使用的接口或类的“丢弃”实现,而不是创建一个全面实施。
任何类/接口都可以这样实例化,没有什么特别之处:
public interface Foo {
String foo();
}
...
public class Main {
public static void main(String[] args) {
System.out.println(new Foo() {
public String foo() {
return "plugh";
}
});
}
}
匿名内部类也会获得自己的类文件,即使它们的源是嵌入的。
在此示例中,除了预期的Main$1.class
文件外,还将为匿名内部类生成Main.class
文件。
答案 1 :(得分:1)
语句:new OnRatingBarChangeListener()
创建一个类的新实例。花括号内的以下部分是类的定义。
在这种情况下,该实现命名接口的匿名类中的类。
匿名类是没有名称声明的类,因此不能像常规命名类一样使用。
这种模式在使用侦听器时非常常见,这些侦听器通常只包含一个到几个执行近乎繁琐任务的方法。
答案 2 :(得分:0)
这是监听器模式。评分栏采用OnRatingBarChangeListener
的实施方式,并在相应的事件上调用其onRatingChanged
方法。
您可以使用任何实现OnRatingBarChangeListener
的类的实例。因此,您可以使用自己的命名类,也可以像示例中那样传递匿名类。示例中的匿名类实际上是一个未命名的类,它扩展了Object并实现了OnRatingBarChangeListener。由于该类未命名,因此无法引用它,因此传递的实例是唯一存在的实例。
答案 3 :(得分:0)
这称为“观察者模式”。一个很好的例子是为java按钮或其他组件添加动作侦听器。例如,
myButton.addActionListener(
new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//Work here
}
});
在这里,“myButton”是主题,ActionListener是观察者。