Java Tip 10: implementacja funkcji zwrotnych w Javie

Programiści znający model programowania MS-Windows i X Window System są przyzwyczajeni do przekazywania wskaźników funkcji, które są wywoływane (czyli „wywołane z powrotem”), gdy coś się dzieje. Model obiektowy Javy nie obsługuje obecnie wskaźników metod, a zatem wydaje się wykluczać korzystanie z tego wygodnego mechanizmu. Ale nie wszystko stracone!

Obsługa interfejsów Java zapewnia mechanizm, za pomocą którego możemy uzyskać odpowiednik wywołań zwrotnych. Sztuczka polega na zdefiniowaniu prostego interfejsu, który deklaruje metodę, którą chcemy wywołać.

Załóżmy na przykład, że chcemy być powiadamiani o zdarzeniu. Możemy zdefiniować interfejs:

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

daje nam to uchwyt na wszelkich obiektach klas, które implementują interfejs. Nie musimy więc przejmować się żadnymi innymi informacjami typu obcego. Jest to o wiele przyjemniejsze niż hakowanie funkcji trampoline C, które używają pola danych widżetów do utrzymywania wskaźnika obiektu podczas korzystania z kodu C++ Z Motif.

klasa, która będzie sygnalizować zdarzenie, musi oczekiwać obiektów implementujących interfejs InterestingEvent, a następnie wywołać metodę interestingEvent() odpowiednio.

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 (); } //... } // ...}

W tym przykładzie użyłem predykatu somethingHappened do śledzenia, czy zdarzenie powinno zostać wywołane. W wielu przypadkach sam fakt, że metoda została wywołana, wystarcza do sygnalizacji interestingEvent().

kod, który chce otrzymać powiadomienie o zdarzeniu, musi zaimplementować interesujący interfejs Event i po prostu przekazać odniesienie do siebie do powiadamiacza o zdarzeniu.

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... } //...}

to wszystko. Mam nadzieję, że użycie tego prostego idiomu Java sprawi, że przejście na Javę będzie nieco mniej nerwowe.

opierając się na kofeinie, cukrze i zbyt małej ilości snu, John D. Mitchell konsultuje się przez ostatnie dziewięć lat i opracował oprogramowanie PDA w języku oo W firmie Geoworks. Swoje uzależnienie od Javy finansuje poprzez tworzenie kompilatorów, Systemów Tcl / Tk, C++ i Java. Jest współautorem nowej książki o Javie Making Sense of Java, a obecnie opracowuje kompilator Javy.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.