자바 팁 10 : 자바에서 콜백 루틴 구현

MS-Windows 및 X Window System의 이벤트 기반 프로그래밍 모델에 정통한 개발자는 어떤 일이 발생할 때 호출되는 (즉, "콜백") 함수 포인터를 전달하는 데 익숙합니다. Java의 객체 지향 모델은 현재 메소드 포인터를 지원하지 않으므로이 편안한 메커니즘을 사용하지 못하는 것 같습니다. 그러나 모든 것을 잃지 않았습니다!

Java의 인터페이스 지원 은 콜백과 동등한 것을 얻을 수있는 메커니즘을 제공합니다. 트릭은 우리가 호출하고자하는 메소드를 선언하는 간단한 인터페이스를 정의하는 것입니다.

예를 들어, 이벤트가 발생할 때 알림을 받고 싶다고 가정합니다. 인터페이스를 정의 할 수 있습니다.

public interface InterestingEvent {// 이것은 단지 일반적인 메소드이므로 무언가를 반환하거나 // 원하는 경우 인수를 취할 수 있습니다. public void InterestEvent (); }

이를 통해 인터페이스 를 구현 하는 클래스의 모든 객체를 파악할 수 있습니다. 따라서 다른 외부 유형 정보에 대해 걱정할 필요가 없습니다. 이것은 Motif에서 C ++ 코드를 사용할 때 객체 포인터를 보유하기 위해 위젯 의 데이터 필드 를 사용하는 트램펄린 C 함수를 해킹하는 것보다 훨씬 좋습니다 .

이벤트를 알리는 클래스는 InterestingEvent 인터페이스 를 구현하는 객체를 예상 한 다음 , InterestingEvent () 메서드를 적절하게 호출해야합니다 .

public class EventNotifier {private InterestingEvent ie; private 부울 somethingHappened; public EventNotifier (InterestingEvent event) {// 나중에 사용할 수 있도록 이벤트 개체를 저장합니다. 즉 = 이벤트; // 아직보고 할 내용이 없습니다. somethingHappened = 거짓; } // ... public void doWork () {// 다른 곳에 설정된 술어를 확인합니다. if (somethingHappened) {// 인터페이스의 메서드를 호출하여 짝수 신호를 보냅니다. ie.interestingEvent (); } // ...} // ...}

이 예제에서는 이벤트가 트리거되어야하는지 여부를 추적 하기 위해 somethingHappened 술어를 사용했습니다 . 많은 경우에 메서드가 호출되었다는 사실만으로도 funnyEvent () 신호를 보낼 수 있습니다.

이벤트 알림을 수신하려는 코드는 InterestingEvent 인터페이스를 구현하고 이벤트 알림 에 자신에 대한 참조를 전달 해야합니다 .

공용 클래스 CallMe는 InterestingEvent를 구현합니다. {private EventNotifier en; public CallMe () {// 이벤트 알리미를 생성하고 자신을 전달합니다. en = 새로운 EventNotifier (this); } // 이벤트에 대한 실제 처리기를 정의합니다. public void interestEvent () {// 와우! 정말 흥미로운 일이 생겼 나봐요! // 무언가를하세요 ...} // ...}

그게 전부입니다. 이 간단한 Java 관용구를 사용하면 Java 로의 전환이 약간 덜 불안해집니다.

카페인, 설탕, 너무 적은 수면을 취한 John D. Mitchell은 지난 9 년 동안 대부분의 컨설팅을 해왔으며 Geoworks에서 OO 어셈블리 언어로 PDA 소프트웨어를 개발했습니다. 그는 컴파일러, Tcl / Tk, C ++ 및 Java 시스템을 작성하여 Java 중독에 자금을 지원합니다. 그는 인기있는 새로운 Java 책 Making Sense of Java를 공동 집필했으며 현재 Java 컴파일러를 개발하고 있습니다.

이 이야기 "Java Tip 10 : Java에서 콜백 루틴 구현"은 원래 JavaWorld에서 게시했습니다.