Program Club

Java에서 이벤트 리스너와 핸들러의 차이점은 무엇입니까?

proclub 2020. 10. 14. 21:26
반응형

Java에서 이벤트 리스너와 핸들러의 차이점은 무엇입니까?


Java의 일반적인 용어로 이벤트에 대한 리스너 및 핸들러가 있습니다.
내 말은 API에서 사용할 수있는 것만 무의식적으로 사용한다는 의미입니다.

제 질문은 어떤 경우에 리스너를 사용하고 어떤 경우에 이벤트 핸들러를 사용합니까?

그들 사이의 차이점은 무엇입니까? 형질??

이유를 검색했지만 Java에 대한 적절한 설명을 찾을 수 없습니다.


리스너와 핸들러 사이에 공식적으로 정의 된 차이는 없습니다. 어떤 사람들은 아마도 그것들이 상호 교환 가능하다고 주장 할 것입니다. 그러나 나에게는 의미가 약간 다릅니다.

리스너 는 소스의 이벤트를 구독하는 객체입니다. Cf. 관찰자 패턴 . 일반적으로 각 이벤트 유형에 대해 많은 리스너를 구독 할 수 있으며 메서드를 통해 추가 됩니다 addXyzListener.

예 :MouseListener 자바 API이다.

핸들러 는 특정 이벤트를 처리하는 객체입니다. 일반적인 시나리오는 특정 이벤트 / 작업에 대한 처리기를 생성자에 대한 인수로 제공하거나 메서드를 통해 처리기를 설정 하는 setXyzHandler것입니다. 즉, 일반적으로 각 이벤트 유형에 대해 하나의 핸들러가 있습니다.

예 :MemoryHandler 자바 API이다.


가장 기본적인 차이점은 연관성입니다.

  • 리스너는 이벤트 소스 (예 : 키보드) 와 연결됩니다 .
  • 핸들러는 이벤트 와 연관됩니다 (예 : keydown).

일반적으로 말하면 모든 이벤트를 관리하는 중앙 핸들러 관리자가 하나 뿐이고 리스너의 경우 수신하려는 각 엔티티는 자체 리스너 컬렉션을 관리해야합니다.


이것이 내가 보는 방식입니다.

리스너 이벤트의 시계는 발사합니다. 예를 들어, a KeyListener는 KeyEvents를 대기하고, a MessageListener는 메시지가 큐에 도착하기를 기다립니다.

핸들러는 이벤트와 처리에 대한 책임이 있습니다. 일반적으로 리스너와 핸들러는 서로 협력합니다. 예를 들어, KeyListener는 ExitHandler에게 "문자 Q가 눌려졌습니다"라고 알려주고 핸들러는 리소스 정리 및 응용 프로그램을 정상적으로 종료하는 등의 논리를 수행합니다. 유사하게 ButtonClickListener는 동일한 ExitHandler에게 "Exit button was clicked"를 알려줍니다. 따라서이 경우 두 개의 다른 이벤트, 두 개의 다른 리스너가 있지만 하나의 핸들러가 있습니다.


리스너는 이벤트를 설명하는 데이터 값 객체 인 이벤트를 수신합니다. 사건이 발생한시기와 사건의 순서는 종종 중요합니다. '0'다음에 '1'을 누르는 것은 '1'과 '0'과 다릅니다.

핸들러는 새로운 소켓 연결과 같은 복잡한 객체를 처리합니다. 핸들러는 임의의 시간 동안 오브젝트를 처리 할 수 ​​있습니다. 개체 생성 및 순서 시간은 그렇게 중요하지 않습니다. client0 또는 client1의 연결은 순서에 관계없이 발생할 수 있습니다.


리스너는 이벤트가 발생할 때 알림을받는 객체이며 2 가지 주요 요구 사항이 있습니다. 1은 특정 유형의 이벤트에 대한 알림을 수신하기 위해 하나 이상의 소스에 등록되어 있어야합니다. 2는 수신 및 처리 할 메서드를 구현해야합니다. 이러한 알림. 핸들러는 이벤트 처리를 담당합니다.


구체적인 리스너도 이벤트 핸들러이거나 적어도 이벤트 핸들러로 간주 할 수있는 메소드가 있기 때문에 차이가 미묘하다고 생각합니다. 즉, 구체적인 Listener는 방금 발생한 이벤트 (이벤트 소스에서)에 대한 모든 유용한 정보와 함께 이벤트 객체 (이벤트 소스에서)를 수신 한 후 이벤트에 대한 반응을 처리하거나 관리합니다. 이 리스너는 이벤트가 발생할 때 이벤트 소스 객체에 의해 차례로 실행되는 하나 이상의 메소드를 구현하도록 강제하는 xxxListener 인터페이스를 구현해야하므로 리스너 자체는 핸들러로 간주 될 수 있습니다. Listener 객체에 의해 구현 된 Listener 인터페이스는 실제 이벤트 처리기로 간주 될 수 있습니다. 그래서 저는 이벤트 핸들러를 이벤트에 대한 반응으로 실행되는 코드로 간주합니다. 이것은 Observer 디자인 패턴과 같은 좀 더 추상적 인 개념의 요소 인 Listener 객체와 다릅니다. 이것은 주제에 대한 나의 개인적인 견해입니다.


내 생각에 가장 중요한 차이점은 이벤트 유형별 핸들러와 달리 이벤트 소스별로 리스너를 사용한다는 것입니다.


개념적으로는 동일합니다. UI 이벤트에 대한 응답으로 어떤 작업을 수행하는 객체입니다. 일반적으로 Swing에서는 이러한 객체를 룩앤필 수준 (낮은 수준의 위젯 이벤트 처리 용)에서 "핸들러"라고하고,보다 추상적 인 UI 수준 (애플리케이션 로직을 구현하는 경우)에서는 "리스너"라고합니다. ).


EventHandler는 모든 UI 컨트롤에 대해 JavaFX에 도입되었습니다. 리스너는 속성과 같은 Observable을 위해 차용됩니다.

EventHandler는 관찰 가능한 이벤트와 UI 이벤트를 구별하는 방법입니다.


나는 모든 정보를 이해하려고 노력했지만 길을 잃었습니다. 델파이 (파스칼), C, C ++, 자바를 살펴 봤는데 ... 아무것도 명확하지 않습니다. 나는 완전히 길을 벗어 났을지도 모르니 제발 정중하게 말 해주세요.

이벤트 발신자 한 명, 발신자가 포수를 등록하는 한 한 명. 파일 (처리 코드가 4 개의 대화 상자가 아닌 다른 모듈에 있음)이 변경 될 때마다 업데이트해야하는 4 개의 대화 상자가 있습니다. 각각 구식으로 업데이트하는 것을 고려했지만 Delphi 이벤트와 메시지 처리를 살펴 보았습니다. 보자 :

파일 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 다음 다음 이벤트 처리기로 계속하는 것은 구현하기 쉽습니다.

All that because I want to exercise my brain... to prevent Alzheimer's, not very successfully I might add.


It is semantics.

  • Listener is interface.
  • Adaptor is class that implements specific interface and provides empty implementation for its methods. This helps if you do not have to implement all methods of interface.
  • Handler implements several interfaces or delegates calls to several interfaces.

참고URL : https://stackoverflow.com/questions/4725241/whats-the-difference-between-event-listeners-handlers-in-java

반응형