[java] Java에서 사용자 정의 이벤트 작성

Java에서 이와 같은 작업을 수행하고 싶지만 방법을 모르겠습니다.

“object 1 say”hello “”이벤트가 발생하면 object 2는 “hello”라고 말하여 해당 이벤트에 응답합니다.

누군가 나에게 힌트 나 샘플 코드를 줄 수 있습니까?



답변

아마도 관찰자 패턴 을 조사하고 싶을 것 입니다 .

시작하기위한 샘플 코드는 다음과 같습니다.

import java.util.*;

// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
    void someoneSaidHello();
}

// Someone who says "Hello"
class Initiater {
    private List<HelloListener> listeners = new ArrayList<HelloListener>();

    public void addListener(HelloListener toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        // Notify everybody that may be interested.
        for (HelloListener hl : listeners)
            hl.someoneSaidHello();
    }
}

// Someone interested in "Hello" events
class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

class Test {
    public static void main(String[] args) {
        Initiater initiater = new Initiater();
        Responder responder = new Responder();

        initiater.addListener(responder);

        initiater.sayHello();  // Prints "Hello!!!" and "Hello there..."
    }
}

관련 기사 : Java : 사용자 정의 이벤트 작성


답변

당신이 원하는 것은 관찰자 패턴 의 구현입니다 . 직접 수행하거나 java.util.Observerand 같은 Java 클래스를 사용할 수 있습니다java.util.Observable


답변

이를 설정하는 방법에는 3 가지가 있습니다.

  1. Thrower 내면에 Catcher
  2. Catcher 내면에 Thrower
  3. Thrower그리고 Catcher본 실시 예에서 다른 클래스의 내부Test

인용 작업 GitHub의 예 I AM 단지의 주석 “다른 사람을 시도 옵션 3에 기본값Optional은 AS”코드는 주로 지정할 클래스의 블록 및 설정 클래스를${Main-Class}의 변수build.xml 파일 하십시오.

4 사이드 코드를 던질 때 필요한 것 :

import java.util.*;//import of java.util.event

//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
    public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
    List<ThrowListener> listeners = new ArrayList<ThrowListener>();
    public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
    //Set of functions that Throw Events.
        public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
            System.out.println("Something thrown");
        }
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}

2 클래스에서 이벤트를 받기 위해 클래스 파일에 필요한 것

/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
    @Override public void Catch() {
        System.out.println("I caught something!!");
    }
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}


답변

다음은 정확히 동일하지는 않지만 인터페이스 메소드에 호출을 추가하기 위해 스 니펫을 검색했지만이 질문을 찾았으므로 나처럼 그것을 검색하고있는 사람들을 위해이 스 니펫을 추가하기로 결정했습니다. :

 public class MyClass
 {
        //... class code goes here

        public interface DataLoadFinishedListener {
            public void onDataLoadFinishedListener(int data_type);
        }

        private DataLoadFinishedListener m_lDataLoadFinished;

        public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
            this.m_lDataLoadFinished = dlf;
        }



        private void someOtherMethodOfMyClass()
        {
            m_lDataLoadFinished.onDataLoadFinishedListener(1);
        }
    }

사용법은 다음과 같습니다.

myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
            @Override
            public void onDataLoadFinishedListener(int data_type) {
                }
            });


답변