2013-09-03 3 views
0

익명 클래스에 대해 익히고 오라클에서 가져 왔습니다. 익명의 클래스를 사용하지 않으면 누군가가 어떻게 보이는지 보여 줄 수 있기를 바랍니다. 나는 새로운 수업으로 이것을 어떻게 끝내었을 까? 익명의 Java 클래스를 익명이 아닌 클래스로 재 작성하려면 어떻게해야합니까?

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 당신이 말 '안녕하세요'버튼을 선택하면 어떻게되는지 지정합니다. 이 메서드에는 EventHandler 유형의 객체가 필요합니다. EventHandler 인터페이스에는 처리 방법이 하나만 포함되어 있습니다. 이 메서드를 새 클래스으로 구현하는 대신이 예제에서는 익명 클래스 식을 대신 사용합니다. 이 표현식은 btn.setOnAction 메소드에 전달 된 인수입니다.

출처 :

+0

일반 최상위 수준 클래스와 익명 클래스 간의 차이점과 유사점을 고려하십시오. –

+0

@LuiggiMendoza 무엇을 해야할지 모르겠습니다. – johnny

+0

정말로 ... 새로운 클래스를 만들면 EventHandler 가 구현됩니다. 미안합니다. – Felquir

답변

3

http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html 그냥 어딘가에 새로운 익명이 아닌 클래스를 만들 수 있습니다. 나는 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!"); 
     } 
    } 
} 
+0

그래서 MyEventHandler 클래스를 다른 파일에 둘 필요가 없습니까? 아니면 가져 오기를 사용하셨습니까? – johnny

+0

아니요, 그럴 필요는 없습니다. 원한다면 할 수 있습니다. 대답을 짧게 유지하기 위해 중첩 된 클래스 파일을 만들기로했습니다. –

+0

@Martinj 감사. – johnny

0

.

  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내부 클래스입니다.

1

EventHandler 클래스는 상태 비 저장이므로이 클래스의 모든 인스턴스는 기능적으로 동일합니다. handle 작업을 수행하려면이 클래스의 단일 인스턴스가 하나만 필요합니다.이 메서드의 기능은 전달 된 매개 변수에만 의존하기 때문에 개체의 상태에 아무런 영향을 미치지 않으므로이 작업을 수행해야합니다. 싱글 톤이 되십시오. 익명 클래스를 사용하면 setOnAction에 대한 호출이 실행될 때마다 새 인스턴스가 만들어집니다. 각 방법에 불필요한 객체의 생성을 방지 할 수 있습니다 이러한 방법으로

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 
     } 
    } 
} 

:이 문제를 방지하려면, 당신은 개인 정적 최종 필드에 EvenHandler 구현의 인스턴스를 저장하고 다음과 같이 정적 팩토리 메소드를 사용하여 재사용 고려할 수 있습니다 요구.