Java Tips 10: Implementer tilbakeringingsrutiner I Java

Utviklere som er kjent i DEN hendelsesdrevne programmeringsmodellen AV MS-Windows og X Window-Systemet, er vant til å passere funksjonspekere som påberopes (det vil si «kalt tilbake») når noe skjer. Javas objektorienterte modell støtter for øyeblikket ikke metodepekere, og synes dermed å utelukke bruk av denne komfortable mekanismen. Men alt er ikke tapt!

Javas støtte for grensesnitt gir en mekanisme som vi kan få tilsvarende tilbakekallinger. Trikset er å definere et enkelt grensesnitt som erklærer metoden vi ønsker å bli påkalt.

anta for eksempel at vi vil bli varslet når en hendelse skjer. Vi kan definere et grensesnitt:

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

Dette gir oss et grep om objekter av klasser som implementerer grensesnittet. Så, vi trenger ikke bekymre oss med noen annen overflødig type informasjon. Dette er mye hyggeligere enn hacking trampoline C-funksjoner som bruker datafeltet til widgets for å holde en objektpeker når Du bruker C++ – kode med Motif.

klassen som signaliserer hendelsen, må forvente objekter som implementerer InterestingEvent-grensesnittet, og deretter aktivere interestingEvent () – metoden etter behov.

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

i det eksemplet brukte jeg somethinghappened predikatet for å spore om hendelsen skulle utløses. I mange tilfeller er det faktum at metoden ble kalt nok til å garantere signalering av interestingEvent ().

koden som ønsker å motta hendelsesvarselet, må implementere InterestingEvent-grensesnittet og bare sende en referanse til seg selv til hendelsesvarsleren.

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

Det er alt som skal til. Jeg håper å bruke Denne enkle Java idiom vil gjøre overgangen Til Java litt mindre nervøs.

Subsisting på koffein, sukker og for lite søvn, John D. Mitchell har vært rådgivning for de fleste av de siste ni årene, og har utviklet PDA programvare I OOassembly språk På Geoworks. Han finansierer Sin Java addiction ved å skrive kompilatorer, Tcl / Tk, C++ og Java-systemer. Han medforfattet thehot ny Java bok Making Sense Of Javaog utvikler for tiden En Java-kompilator.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.