Java의 일반적인 용어로 이벤트에 대한 리스너 및 핸들러가 있습니다.
내 말은 API에서 사용할 수있는 것만 무의식적으로 사용한다는 의미입니다.
제 질문은 어떤 경우에 리스너를 사용하고 어떤 경우에 이벤트 핸들러를 사용합니까?
그들 사이의 차이점은 무엇입니까? 형질??
이유를 검색했지만 Java에 대한 적절한 설명을 찾을 수 없습니다.
답변:
리스너와 핸들러간에 공식적으로 정의 된 차이는 없습니다. 어떤 사람들은 아마도 그것들이 상호 교환 가능하다고 주장 할 것입니다. 그러나 나에게는 의미가 약간 다릅니다.
리스너 는 소스의 이벤트를 구독하는 객체입니다. Cf. 관찰자 패턴 . 일반적으로 각 이벤트 유형에 대해 많은 리스너를 구독 할 수 있으며 메서드를 통해 추가 됩니다 addXyzListener
.
예 :MouseListener
자바 API이다.
핸들러 는 특정 이벤트를 처리하는 객체입니다. 일반적인 시나리오는 특정 이벤트 / 작업에 대한 처리기를 생성자에 대한 인수로 제공하거나 메서드를 통해 처리기를 설정 하는 setXyzHandler
것입니다. 즉, 일반적으로 각 이벤트 유형에 대해 하나의 핸들러가 있습니다.
예 :MemoryHandler
자바 API이다.
이것이 내가 보는 방식입니다.
리스너 이벤트의 시계는 발사합니다. 예를 들어, a KeyListener
는 KeyEvents를 대기하고, a MessageListener
는 메시지가 큐에 도착하기를 기다립니다.
핸들러는 이벤트와 처리에 대한 책임이 있습니다. 일반적으로 리스너와 핸들러는 함께 진행됩니다. 예를 들어, KeyListener는 ExitHandler에게 "문자 Q가 눌려졌습니다"라고 알려주고 핸들러는 리소스 정리 및 응용 프로그램을 정상적으로 종료하는 것과 같은 논리를 수행합니다. 유사하게 ButtonClickListener는 동일한 ExitHandler에게 "Exit button was clicked"를 알려줍니다. 따라서이 경우 두 개의 다른 이벤트, 두 개의 다른 리스너가 있지만 하나의 핸들러가 있습니다.
구체적인 리스너도 이벤트 핸들러이거나 적어도 이벤트 핸들러로 간주 될 수있는 메소드가 있기 때문에 차이가 미묘하다고 생각합니다. 즉, 구체적인 Listener는 방금 발생한 이벤트 (이벤트 소스에서)에 대한 모든 유용한 정보와 함께 이벤트 객체 (이벤트 소스에서)를 수신 한 후 이벤트에 대한 반응을 처리하거나 관리합니다. 이 리스너는 이벤트가 발생할 때 이벤트 소스 객체에 의해 차례로 실행되는 하나 이상의 메소드를 구현하도록 강제하는 xxxListener 인터페이스를 구현해야하므로 리스너 자체는 핸들러로 간주 될 수 있습니다. Listener 객체에 의해 구현 된 Listener 인터페이스는 실제 이벤트 처리기로 간주 될 수 있습니다. 그래서 저는 이벤트 핸들러를 이벤트에 대한 반응으로 실행되는 코드로 간주합니다. 이것은 Observer 디자인 패턴과 같은 좀 더 추상적 인 개념의 요소 인 Listener 객체와 다릅니다. 이것은 주제에 대한 나의 개인적인 견해입니다.
나는 모든 정보를 이해하려고 노력했지만 길을 잃었습니다. 델파이 (파스칼), C, C ++, 자바를 살펴 봤는데 ... 아무것도 분명하지 않기 때문에 한 달이 지나면 이것이 문제입니다. 나는 완전히 길을 벗어 났을지도 모르니 제발 정중하게 말 해주세요.
이벤트 발신자 한 명, 발신자가 포수를 등록하는 한 한 명. 파일 (처리 코드가 4 개의 대화 상자가 아닌 다른 모듈에 있음)이 변경 될 때마다 업데이트해야하는 4 개의 대화 상자가 있습니다. 각각 구식 업데이트를 고려했지만 델파이 이벤트와 메시지 처리를 살펴 보았습니다. 보자 :
파일 F (발신자)는 읽기를 마치고 표시 할 데이터와 사용자가 함께 재생할 데이터가 있다는 사실을 Dialogs 1..4에 알려야합니다. 무엇이 최고입니까?
Dialogs 1..4를 리스너로 등록하고 Sender가 어떻게 든 OnUpdatedDataEvent를 트리거하도록 하시겠습니까?
Dialogs 1..4가 메시지를 포착하기를 바라면서 시스템을 통해 메시지를 보내보십시오.
이벤트는 메시지를 전달하지 않는 동안 결합 된 상태를 유지하며 디버깅하기가 어렵습니다.
그리고 File 블록 코드가 어떻게 4 개의 리스너 (대화 상자)를 등록 할 수 있는지 궁금합니다.
내가보고있는 것은 캐스케이드 호출의 가능성입니다. 즉, 호출자가 한 리스너를 호출하고 다음 리스너를 호출합니다 ... 체인의 끝에 도달 할 때까지. 그게 가능한지 궁금합니다.
예 :
파일 F는 언어 목록입니다. 이제 DialogBox 1은 목록에 작업을 수행합니다 (예 : 새 언어 추가). 그 콤보 상자는 F 파일을 업데이트합니다. 이것은 차례로 DataUpdatedEvent를 트리거합니다. 4 개의 대화 상자에는 팝업 될 때 언어 목록을 표시하는 TComboBox가 있습니다. 4 개의 상자가 변경 사항을 인식하고 새로 업데이트 된 파일로 자신의 콤보 상자 내용을 업데이트하기를 원합니다. 콤보 상자가 내용을 새로 고쳐야한다는 것을 어떻게 인식하는지 걱정할 필요가 없습니다. 예상대로 작동하면 Sender 매개 변수가 전달되고 dataUpdateEvent를 트리거 한 대화 상자는 이미 업데이트되므로 무시됩니다. 결국 if sender = self 다음 다음 이벤트 처리기로 계속하는 것은 구현하기 쉽습니다.
뇌 운동을하고 싶기 때문에 ... 알츠하이머를 예방하기 위해, 그다지 성공적으로 추가 할 수는 없습니다.
의미론입니다.