Java에서 사용자 지정 이벤트 생성
자바에서 이런 걸 하고 싶은데 방법을 모르겠어요.
"object 1 say 'hello" 이벤트가 발생하면 객체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 클래스를 사용할 수 있습니다.java.util.Observer
그리고.java.util.Observable
셋업 방법에는, 다음의 3가지가 있습니다.
Thrower
의 내부에Catcher
Catcher
의 내부에Thrower
Thrower
그리고.Catcher
이 예에서는 다른 클래스의 내부Test
동작하고 있는 GITHUB의 예에서는, 디폴트로는 옵션 3이 되어 있습니다.그 외의 경우는, 「」의 코멘트를 해제해 주세요.Optional
" 메인이 되고 싶은 클래스의 코드 블록과 그 클래스를${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) {
}
});
용어.
- 청취자는 관찰자/감시자
- 디스패처는 서브젝트/컨테이너입니다.
통상, 옵서버 패턴을 실장하는 경우, 리스너가 옵서버 패턴을 서브스크라이브 하기 전에 디스패처가 존재해야 합니다.하지만 시그널이라고 불리는 더 좋은 방법이 있다.
신호는 이벤트 라이브러리입니다.Register와 Dispatch 이벤트를 모두 허용하는 Signal 객체를 도입함으로써 디스패처의 리스너를 분리합니다.신호는 프록시를 통해 인터페이스에서 자동으로 생성됩니다.청취자 관리를 위한 모든 상용 코드를 관리하며, 멋진 설탕 코드 API를 추가합니다.
interface Chat{
void onNewMessage(String s);
}
class Foo{
Signal<Chat> chatSignal = Signals.signal(Chat.class);
void bar(){
chatSignal.addListener( s-> Log.d("chat", s) ); // logs all the messaged to Logcat
}
}
class Foo2{
Signal<Chat> chatSignal = Signals.signal(Chat.class);
void bar2(){
chatSignal.dispatcher.onNewMessage("Hello from Foo2"); // dispatches "Hello from Foo2" message to all the listeners
}
}
이 예에서는 신호가 에서 자동으로 생성됩니다.Chat
인터페이스입니다.이 기능을 통해Foo
등록하다Foo2
상호 작용 없이 새 메시지를 발송합니다.
면책사항:나는 시그널의 작가이다.
에헴, 나는 최근에 이벤트를 해야 했는데 우연히 이 주제를 발견했어.이벤트의 C# 버전에 근거해, 독자적인 실장을 추가하기로 했습니다.누군가 읽어주면 도움이 될 것 같습니다.
@FunctionalInterface
public interface Action{
void accept(Object... args);
}
public class CustomEvent {
protected List<Action> listeners = new ArrayList<>();
public void addListener(Action arg0){
listeners.add(arg0);
}
public void removeListener(Action arg0){
listeners.remove(arg0);
}
public void invoke(Object... args){
for (Action listener : listeners) {
listener.accept(args);
}
}
}
public class Example1 {
public CustomEvent onValueChanged;
private void doSomething(){
onValueChanged.invoke(); // or .invoke(arg0, arg1, ...)
}
}
public class Example2 {
private Example1 example1;
private Action linkToAction;
private void init(){
example1 = new Example1();
linkToAction = args -> {
doSomethingAnother(); // or doSomethingAnother((Type)args[0], (Type)args[1], ...)
}
example1.onValueChanged.addListener(linkToAction);
}
public void doSomethingAnother(){}
public void unsubscribe(){
example1.onValueChanged.removeListener(linkToAction);
}
}
이것은 간단한 예입니다.제가 작성한 액션인터페이스의 실장은 컨슈머 인터페이스를 기반으로 하고 있기 때문에 메서드명은 비슷하지만 변경할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/6270132/create-a-custom-event-in-java
'source' 카테고리의 다른 글
왜 내 배열이 아닌 옵저버가 있는 거죠? (0) | 2022.08.15 |
---|---|
Java 8 코드를 Java 7 JVM에서 실행하도록 컴파일할 수 있습니까? (0) | 2022.08.15 |
vue-scroll 사용 방법 (0) | 2022.08.15 |
Vue 앱 서버와 Express를 결합하는 방법 (0) | 2022.08.15 |
상위 구성 요소에서 v-dialog를 열고 닫으려면 어떻게 해야 합니까?Vuex를 사용하시겠습니까? (0) | 2022.08.15 |