Java savjet 10: Primijenite rutine povratnog poziva u Javi

Programeri koji se poznaju u programskom modelu MS-Windows i X Window System vođenom događajima navikli su na prosljeđivanje pokazivača funkcija koji se pozivaju (to jest, "pozivaju natrag") kada se nešto dogodi. Javin objektno-orijentirani model trenutno ne podržava pokazivače metoda, pa se čini da onemogućava upotrebu ovog udobnog mehanizma. Ali sve nije izgubljeno!

Java podrška sučelja pruža mehanizam pomoću kojeg možemo dobiti ekvivalent povratnih poziva. Trik je u definiranju jednostavnog sučelja koje deklarira metodu za koju želimo da se pozove.

Na primjer, pretpostavimo da želimo biti obaviješteni kada se dogodi neki događaj. Možemo definirati sučelje:

javno sučelje InterestingEvent {// Ovo je samo uobičajena metoda tako da može nešto vratiti ili // uzeti argumente ako želite. javna praznina interestingEvent (); }

To nam daje pristup svim objektima klasa koji implementiraju sučelje. Dakle, ne trebamo se baviti bilo kojim drugim stranim informacijama. Ovo je puno ljepše od hakiranja trampolin C funkcija koje koriste podatkovno polje widgeta za držanje pokazivača objekta kada koriste C ++ kôd s Motivom.

Klasa koja će signalizirati događaj mora očekivati ​​objekte koji implementiraju sučelje InterestingEvent, a zatim po potrebi aktivirati metodu interestingEvent () .

javna klasa EventNotifier {private InterestingEvent ie; privatno logičko neštoHeppened; javni EventNotifier (InterestingEvent event) {// Spremite objekt događaja za kasniju upotrebu. tj. = događaj; // Još ništa za prijavljivanje. somethingHappened = false; } // ... public void doWork () {// Provjerite predikat koji je postavljen drugdje. if (somethingHappened) {// signalizira par pozivanjem metode sučelja. tj.zanimljivDogađaj (); } // ...} // ...}

U tom sam primjeru upotrijebio predikat somethingHappened da bih pratio treba li događaj aktivirati ili ne. U mnogim je slučajevima sama činjenica da je metoda pozvana dovoljna da opravda signaliziranje interestingEvent () .

Kôd koji želi primiti obavijest o događaju mora implementirati sučelje InterestingEvent i samo proslijediti referencu na sebe prijavitelju događaja.

javna klasa CallMe implementira InterestingEvent {private EventNotifier hr; public CallMe () {// Stvorimo obavijest o događaju i proslijedimo mu se. hr = novi EventNotifier (ovaj); } // Definirajte stvarni rukovatelj događajem. javna praznina interestingEvent () {// Wow! Sigurno se dogodilo nešto zaista zanimljivo! // Učini nešto... } //... }

To je sve. Nadam se da će vam ovaj jednostavan Java idiom učiniti prelazak na Javu malo manje nervoznim.

Prehranjujući se kofeinom, šećerom i premalo sna, John D. Mitchell većinu je posljednjih devet godina savjetovao i razvio PDA softver na OO montažnom jeziku u Geoworksu. Svoju ovisnost o Javi financira pisanjem kompajlera, Tcl / Tk, C ++ i Java sustava. Suautor je vruće nove Java knjige Making Sense of Java i trenutno razvija Java kompajler.

Ovu priču, "Java tip 10: Implementirajte rutine povratnog poziva u Javi" izvorno je objavio JavaWorld.