0

了解匿名类并从 Oracle 获得。我希望有人可以告诉我如果我不使用匿名类会是什么样子。我将如何在新课程中做到这一点?

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

在此示例中,方法调用 btn.setOnAction 指定当您选择 Say 'Hello World' 按钮时会发生什么。此方法需要 EventHandler 类型的对象。EventHandler 接口只包含一个方法,handle。该示例没有使用新类实现此方法,而是使用匿名类表达式。请注意,此表达式是传递给 btn.setOnAction 方法的参数。

来源:http ://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

4

3 回答 3

4

只需在某处创建一个新的非匿名类。我把它作为一个嵌套类在里面HelloWorld

public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new MyEventHandler());

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    public class MyEventHandler implements EvenHandler<ActionEven>
    {
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello World!");
        }
    }
}
于 2013-09-03T14:38:44.127 回答
1

该类EventHandler是无状态的,因此该类的所有实例在功能上都是等效的。我们只需要这个类的一个实例来执行handle操作,因为这个方法的功能只取决于传递给它的参数,它不依赖于对象的状态,因为它没有任何参数。因此,它应该是单身人士。每次setOnAction执行调用时,使用匿名类都会创建一个新实例。为避免这种情况,您可以考虑将EvenHandler实现的实例存储在私有静态最终字段中并通过使用静态工厂方法重用它,如下所示:

public class HandlerProvider{
private static final EvenHandler<ActionEvent> EVENT_HANDLER=new ActionEventHandler();

public static EvenHandler<ActionEvent> getEventHandler(){
return EVENT_HANDLER;
}
private static class ActionEventHandler implements EvenHandler<ActionEvent>
    {
        @Override
        public void handle(ActionEvent event) {
            //your action goes here
        }
    }
}

通过这种方式,您可以避免在每次方法调用时创建不必要的对象。

于 2013-09-03T15:05:41.013 回答
0

我不知道该怎么办。

  1. 创建一个实现所需接口的新类。1
  2. 将代码从匿名类移动到新类。
  3. 无论在何处使用您的匿名类,都可以通过此类的新实例对其进行更改。

将此应用于提供的示例:

class FooEventHandler implements EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        System.out.println("Hello World!");
    }
}

public class HelloWorld extends Application {
    //...
    @Override
    public void start(Stage primaryStage) {
        //...
        btn.setOnAction(new FooEventHandler());
        //...
    }
}

1:注意实现接口的类将遵循你编写的任何简单类的规则,这意味着它可以是顶级类、内部类或static 内部类。

于 2013-09-03T14:39:53.557 回答