2013-07-20 3 views
0

나는 콜백에 대한 내 머리를 감싸고 있으며 개념을 파악하는 데 어려움을 겪고있다. 다음 코드는 내가어야 흐름을 이해하고 처음부터 끝까지 시작 hereJava의 콜백 이해

을 발견 한 예이다 : 상기

  • CallMe 따라서 생성자를 호출 인스턴스화 클래스
  • 변수 en 가 설정되고,이어서 EventNotifier 클래스를 인스턴스화하고 객체에 대한 참조가 전달되는 생성자를 호출합니다. CallMe
  • 변수 ie이 객체 01로 설정됩니다. 생성자
  • 변수 somethinghappened에 전달했다는 false로 설정되어
  • 은 음, 어디 ... 다 (I 일부 조건문이 다른 값을 설정할지 여부를 결정하는 데 사용되는 가정 것)?

이 코드를 이해할 수 없습니다. doWork은 어떻게 호출 되나요? 이것이 사건을 어떻게 의미합니까? 왜 callme의 생성자에서 interestingevent을 호출하지 않는 것이 좋을까요 ... 그 이유에 대해서는 somethinghappened의 값을 변경하는 대신에 dowork을 호출하는 것이 좋을까요?

시도해보십시오. 아이디어를 파악하지 못하는 것 같습니다. 콜백은 주로 마우스 나 버튼 클릭과 같은 이벤트가 발생했음을 나타 내기 위해 사용되지만, 발생하는 이벤트와 호출되는 메서드 사이의 연결을 어떻게 만드는지 이해합니다. 변경 사항을 확인하는 루프가 없으므로 이벤트가 트리거되어야합니까?

누군가가 자바에서 콜백에 대한 설명을 제공해 주시고 어떻게 유용하게 사용할 수 있습니까?

public interface InterestingEvent 
{ 
    public void interestingEvent(); 
} 

public class EventNotifier 
{ 
    private InterestingEvent ie; 
    private boolean somethingHappened; 
    public EventNotifier (InterestingEvent event) 
    { 
     ie = event; 
     somethingHappened = false; 
    } 

    public void doWork() 
    { 
     if (somethingHappened) 
     { 
      ie.interestingEvent(); 
     } 
    } 
} 

public class CallMe implements InterestingEvent 
{ 
    private EventNotifier en; 
    public CallMe() 
    { 
     en = new EventNotifier (this); 
    } 

    public void interestingEvent() 
    { 
     // Wow! Something really interesting must have occurred! 
     // Do something... 
    } 
} 

편집 : 승인 된 답의 주석을 참조하시기 바랍니다 ... --- this --- 링크 나에게 매우 도움이되었습니다 =)

답변

2

에는 주요 방법 또는 정적 블록이 없다. 게시 한 코드에서 실제로 아무 것도 실행되지 않습니다. 따라서 doWork()은 호출되지 않습니다. 기사를 읽고 코드를 살펴본 결과 저자가 설명 할 필요가 없다고 느꼈으므로 코드가 불완전하거나 일부 코드가 생략되었을 수 있습니다.

우리는 interface InterestingEvent을하는 class EventNotifier, 그리고 다른 클래스 CallMe, implements InterestingEvent :

여기에 요점입니다.

EventNotifier은 생성자에서 InterestingEvent을 취하고 somethingHappenedfalse으로 설정합니다.

CallMe 생성자는 CallMe 오브젝트 자체에 EventNotifier 생성자에게 참조를 전달함으로써 EventNotifier 부재 인스턴스를 초기화한다.

다음은 코드에 나와 있지 않지만 특정 작업이 감지되면 somethingHappened = true을 설정합니다. 따라서 EventNotifier에 대해 doWork()이 호출되면 의 InterestingEvent ieinterestingEvent()이 호출됩니다. CallMe implements InterestingEvent부터이 작업을 수행 할 수 있습니다.

NB :이 기사는 1996 년 이후로 많이 변경되었습니다. 마우스 클릭 이벤트를 감지하는 방법에 대해 언급했지만이 점은 다릅니다. 이 기사의 요점은 인터페이스와 부울과 함께 객체를 사용하여 무언가가 발생했는지 확인하는 방법을 보여주는 것입니다.

실제로 마우스 클릭을 감지하려면이 tutorial을보십시오. Writing Event Listeners에 대한 또 다른 자습서가 있습니다. 마지막으로, 주석의 스레딩에 대해 묻는대로, 여기에 훌륭한 책인 Java Concurrency in Practice이 있습니다.

+0

어떻게 이벤트를 감지합니까? 루프가있는 스레드를 사용하여 무언가가 발생했다는 신호를 감지합니까? 게다가 부울 값을 설정하는 대신'interestingevent' 메서드를 호출 할 수 있다면 왜 이렇게할까요? –

+0

나는 이것이 인터페이스의 일부 기능을 설명하는 것을 제외하고는 좋은 튜토리얼 또는 설명이 아닐 것이라고 생각합니다. 다른 링크를 게시했습니다. Swing과 AWT는 [Listener classes] (http://docs.oracle.com/javase/tutorial/uiswing/events/api.html)를 제공합니다. 휠을 다시 만들고 싶지는 않습니다. 특정 클래스에 대한 소스 코드를 살펴봄으로써 실제로 작동하는 방법을 볼 수 있지만, 특정 수신기를 기다리는 다른 스레드에있을 것입니다. –

+0

콜백에는 다른 점이 없지만 외부 입력을 감지 할 수 있습니까? 내가 수집 한 것에서 가장 큰 용도는 별도의 스레드에서 실행되는 객체간에 정보를 전달하는 것입니다. –

2

일반적으로 콜백을 사용하는 방법은 PropertyChangeListeners/PropertyChangeSupport 클래스를 사용하는 것입니다. 도움이 될 수있는 수업에 대한 설명이 많이있을 것입니다.

어쨌든, 귀하의 질문에.

먼저 두 개의 클래스가 서로 다른 스레드에서 실행되고 있음을 이해해야합니다. 콜백이하는 일은 다른 스레드에서 어떤 일이 발생했는지 비동기 적으로 알리는 것입니다. 이것은 통지 된 스레드가 제어권을 회복 할 때 그 부분을 수행 할 수있게합니다. 예를 들어 데이터를받는 직렬 회선이 있습니다. InterestingEvent는 10 줄의 문자가이 줄에 도착한 것입니다. 이제는 하나의 EventNotifier가있는 대신 시리얼 라인이 하나씩 들어옵니다. CallMe 인스턴스는 interestingEvent가 호출되었는지 주기적으로 확인하면서 무언가를 실행합니다. interestingEvent는 CallMe가 처리 할 새 데이터가 있음을 알 수 있도록 일종의 플래그를 설정합니다. CallMe는이를보고 흥미로운 이벤트가 무엇이든지 처리하고 정상적인 활동으로 되돌아갑니다.

인터페이스의 전체적인 점은 CallMe의 인스턴스에 액세스하는 잘 정의 된 방법입니다. 더 많이 개발하면 CallMe 인스턴스에 액세스하는 다른 인스턴스를 관리하려고 할 것입니다. 그것은 앞서 언급 한 PropertyChange를 읽는 것이 정말 도움이 될 것입니다.

+0

그래서 나는 그것을 취할 수 있습니다 - [this] (http://stackoverflow.com/questions/17494474/java-passing-an-instance-of-this-during-instantiation/17494655?noredirect = 1 # 17494655) - 질문은 내가 콜백을 사용하는 동안 잠시 물었다. –

+0

번. 그 코드는 그대로 컴파일되지 않습니다. 네가 무엇을하려고하는지 전혀 모르겠다. 콜백의 요점은 두 스레드 사이의 통신을 제공하는 것이다. 표준 자바 GUI 스윙 응용 프로그램, 키보드 및 마우스 이벤트, 마우스 클릭, 키 누름 등은 기본 응용 프로그램 스레드와 다른 스레드에 있습니다. 콜백은 둘 사이에서 통신하는 방법입니다. – wjr

+0

코드가 컴파일되지 않는다는 것을 알았습니다. 그 생각은 객체에 "this"를 전달하면 해당 객체의 "this"에있는 모든 멤버에 액세스 할 수 있다는 것입니다. 콜백이 무엇인지, 콜백이 사용되는 방식을 알고 싶었 기 때문에 사용해야하는지 또는 사용법에 따라 코드의 흐름을 바꿀 수 있는지 이해할 수있었습니다. 귀하의 정보는 매우 유용하며 많은 것을 읽으 실 것입니다 (오, 기쁨) 감사합니다 =) –