使用传入方法实例化Java对象

时间:2012-06-12 10:26:37

标签: java functional-programming

自从我沉迷于Java之后已经有几年了。回到过去,我看到了这种模式:

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

这看起来更像是函数式编程。这是一个很好的模式但是如何传递这样的方法呢?在过去,一个班级是一个班级,一旦编成,你就无法做到这一点。

我的问题是:

  1. 任何人都可以告诉我这种模式的名称吗?
  2. 如何编写可以这种方式实例化的类。
  3. 是否有其他有用的功能模式示例已经进入Java?
  4. Google需要了解更多相关信息吗?
  5. 感谢。

4 个答案:

答案 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是观察者。