Java Tip 10: Implementuj procedury wywołania zwrotnego w Javie

Deweloperzy zaznajomieni z modelem programowania sterowanym zdarzeniami MS-Windows i X Window System są przyzwyczajeni do przekazywania wskaźników funkcji, które są wywoływane (to znaczy „wywoływane z powrotem”), gdy coś się dzieje. Zorientowany obiektowo model Javy nie obsługuje obecnie wskaźników do metod, a zatem wydaje się wykluczać użycie tego wygodnego mechanizmu. Ale nie wszystko stracone!

Obsługa interfejsów w Javie zapewnia mechanizm, dzięki któremu 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 {// To jest zwykła metoda, więc może coś zwrócić lub // pobrać argumenty, jeśli chcesz. public void interestEvent (); }

Daje nam to kontrolę nad dowolnymi obiektami klas implementujących interfejs. Nie musimy więc zajmować się żadnymi innymi obcymi informacjami. Jest to o wiele przyjemniejsze niż hakowanie funkcji C trampoliny, które używają pola danych widżetów do przechowywania wskaźnika obiektu podczas używania kodu C ++ z Motif.

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

public class EventNotifier {private InterestingEvent ie; prywatne coś logicznego się stało; public EventNotifier (InterestingEvent event) {// Zapisz obiekt zdarzenia do późniejszego wykorzystania. ie = wydarzenie; // Nie ma jeszcze nic do zgłoszenia. cośHappened = false; } // ... public void doWork () {// Sprawdź predykat, który jest ustawiony w innym miejscu. if (somethingHappened) {// Sygnalizuj nawet, wywołując metodę interfejsu. ie.interestingEvent (); } // ...} // ...}

W tym przykładzie użyłem somethingHappened orzecznik śledzić, czy zdarzenie powinno być wyzwalane. W wielu przypadkach sam fakt, że metoda została wywołana, wystarczy, aby zasygnalizować intersentEvent () .

Kod, który chce otrzymać powiadomienie o zdarzeniu, musi implementować interfejs InterestingEvent i po prostu przekazać odniesienie do siebie do powiadamiającego o zdarzeniu.

public class CallMe implementuje InterestingEvent {private EventNotifier pl; public CallMe () {// Utwórz powiadomienie o zdarzeniu i przekaż nam się do niego. en = new EventNotifier (this); } // Zdefiniuj faktyczną procedurę obsługi zdarzenia. public void uniqueEvent () {// Wow! Musiało się wydarzyć coś naprawdę interesującego! // Zrób coś... } //... }

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

Utrzymując się na kofeinie, cukrze i zbyt małej ilości snu, John D. Mitchell konsultował się przez większość ostatnich dziewięciu lat i opracował oprogramowanie PDA w języku asemblera OO w firmie Geoworks. Swoje uzależnienie od Javy finansuje pisząc kompilatory, systemy Tcl / Tk, C ++ i Java. Jest współautorem nowej, popularnej książki o języku Java Making Sense of Java, a obecnie pracuje nad kompilatorem języka Java.

Ta historia „Java Tip 10: Implementowanie procedur zwrotnych w Javie” została pierwotnie opublikowana przez JavaWorld.