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


81

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

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

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

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


이 블로그 게시물에는 멋진 요약이 있습니다. lemnik.wordpress.com/2009/03/04/…
kevinarpe 2011

답변:


62

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

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

예 :MouseListener 자바 API이다.

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

예 :MemoryHandler 자바 API이다.


안녕하세요 귀하의 답변에 감사드립니다. "이벤트 구독"이란 무엇을 의미합니까? "청취자"란 무엇을 의미합니까?
BKSpurgeon

@BKSpurgeon, 답변에 연결된 Observer Pattern에 대한 Wikipedia 기사를 참조하십시오.
aioobe

33

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

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

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


당신의 MouseListener는 마우스입니다 whcih 이벤트 소스와 assocaited되는 비유를 보면 마우스, 이벤트 소스입니다
Swapnil

23

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

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

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


5

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


4

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

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


4

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


4

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


2

개념적으로는 UI 이벤트에 대한 응답으로 일부 작업을 수행하는 개체입니다. 일반적으로 Swing에서 이러한 객체는 모양과 느낌 수준 (저수준 위젯 이벤트 처리 용)에서 "핸들러"라고하며,보다 추상적 인 UI 수준 (애플리케이션 로직을 구현할 경우)에서는 "리스너"라고합니다. ).


0

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

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


0

나는 모든 정보를 이해하려고 노력했지만 길을 잃었습니다. 델파이 (파스칼), 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 다음 다음 이벤트 처리기로 계속하는 것은 구현하기 쉽습니다.

뇌 운동을하고 싶기 때문에 ... 알츠하이머를 예방하기 위해, 그다지 성공적으로 추가 할 수는 없습니다.


안녕하세요. StackOverflow에 오신 것을 환영합니다! 이것은 원래 질문 ( "Java에서 이벤트 리스너와 핸들러의 차이점은 무엇입니까?")에 대한 답변입니다. 그렇다면 Java의 이벤트 리스너 대 핸들러의 특성을 명확하게 설명하여 질문에보다 직접적으로 답할 수 있도록 다시 표현하는 것이 도움이 될 수 있습니다.
Alex Lew

-1

의미론입니다.

  • 리스너는 인터페이스입니다.
  • Adapter는 특정 인터페이스를 구현하고 메서드에 대한 빈 구현을 제공하는 클래스입니다. 이는 인터페이스의 모든 메소드를 구현할 필요가없는 경우에 도움이됩니다.
  • 핸들러는 여러 인터페이스를 구현하거나 여러 인터페이스에 대한 호출을 위임합니다.

1
청취자가 반드시 인터페이스라고 말하지는 않겠습니다. BasicButtonListener 예를 들어 콘크리트 클래스입니다.
aioobe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.