3

自从我深入 Java 以来已经有几年了。回过头来,我到处都看到了这种模式:

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
  public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
    // do work
  }
});

这在我看来更像是函数式编程。这是一个很好的模式,但怎么可能通过这样的方法呢?在过去,一个类就是一个类,一旦编译,你几乎无能为力。

我的问题是:

  1. 谁能告诉我这种模式叫什么?
  2. 我怎样才能编写一个可以以这种方式实例化的类。
  3. 是否还有其他有用的功能模式示例已进入 Java?
  4. 我需要谷歌了解更多关于此的信息吗?

谢谢。

4

4 回答 4

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文件。

于 2012-06-12T10:28:05.933 回答
1

声明:new OnRatingBarChangeListener()创建一个类的新实例。花括号内的以下部分是类的定义。

在这种情况下,实现命名接口的匿名类中的类。

匿名类是没有名称声明的类,因此不能像常规命名类一样使用。

这种模式在使用侦听器时非常常见,通常只包含一个或几个方法来完成几乎微不足道的任务。

于 2012-06-12T10:31:43.607 回答
0

这就是监听器模式。评分栏接受一个实现并在适当的事件上OnRatingBarChangeListener调用它的方法。onRatingChanged

您可以使用任何实现的类的实例OnRatingBarChangeListener。因此,您可以使用自己的命名类,也可以将其传递给示例中的匿名类。示例中的匿名类实际上是一个未命名的类,它扩展了 Object 并实现了 OnRatingBarChangeListener。由于该类未命名,因此无法引用它,因此传递的实例是唯一存在的实例。

于 2012-06-12T10:33:05.247 回答
0

这被称为“观察者模式”。一个很好的例子是为 java 按钮或其他组件添加动作侦听器。例如,

myButton.addActionListener(
                new java.awt.event.ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    //Work here
                }
            });

在这里,“myButton”是主题,ActionListener 是观察者。

于 2012-06-12T10:38:49.320 回答