자바 팁 10:자바

에서 콜백 루틴 구현 이벤트 기반 프로그래밍 모델에 익숙한 개발자는 어떤 일이 발생했을 때 호출되는 함수 포인터(즉,”다시 호출 됨”)를 전달하는 데 익숙합니다. 자바의 객체 지향 모델은 현재 메소드 포인터를 지원하지 않으므로 편안한 메커니즘을 사용하는 것을 배제하는 것 같습니다. 그러나 모든 손실되지 않습니다!

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

예를 들어,이벤트가 발생할 때 알림을 받기를 원한다고 가정합니다. 우리는 인터페이스를 정의 할 수 있습니다:

public interface InterestingEvent{ // This is just a regular method so it can return something or // take arguments if you like. public void interestingEvent ();}

이것은 우리에게 인터페이스를 구현하는 클래스의 객체에 그립을 제공합니다. 그래서,우리는 다른 외부 유형 정보와 함께 자신을 염려 할 필요가 없습니다. 이 기능은 위젯의 데이터 필드를 사용하여 객체 포인터를 보유하는 트램폴린 함수를 해킹하는 것보다 훨씬 좋습니다.이 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있는 메서드를 호출할 수 있습니다.

public class EventNotifier{ private InterestingEvent ie; private boolean somethingHappened; public EventNotifier (InterestingEvent event) { // Save the event object for later use. ie = event; // Nothing to report yet. somethingHappened = false; } //... public void doWork () { // Check the predicate, which is set elsewhere. if (somethingHappened) { // Signal the even by invoking the interface's method. ie.interestingEvent (); } //... } // ...}

이 예제에서는 이벤트가 트리거되어야 하는지 여부를 추적하기 위해 발생한 술어를 사용했습니다. 많은 경우에 메소드가 호출되었다는 사실은 흥미로운 이벤트()에 대한 신호를 보증하기에 충분합니다.

이벤트 알림을 받고자 하는 코드는 흥미로운 이벤트 인터페이스를 구현하고 이벤트 알리미에 대한 참조를 전달해야 합니다.

public class CallMe implements InterestingEvent{ private EventNotifier en; public CallMe () { // Create the event notifier and pass ourself to it. en = new EventNotifier (this); } // Define the actual handler for the event. public void interestingEvent () { // Wow! Something really interesting must have occurred! // Do something... } //...}

그게 전부입니다. 이 간단한 자바 관용구를 사용하여 자바로의 전환을 조금 덜 불안하게 만들 수 있기를 바랍니다.

카페인,설탕,그리고 너무 적은 수면을 취하면서 존 디 미첼은 지난 9 년 동안 대부분의 컨설팅을 해왔다. 그는 자바 중독에 자금을 지원하며 컴파일러,티클/티케이,씨++및 자바 시스템을 작성합니다. 그는 자바의 감각을 만드는 뜨거운 새로운 자바 책을 공동 저술하고 현재 자바 컴파일러를 개발하고있다.

답글 남기기

이메일 주소는 공개되지 않습니다.