Programmering

Java Tips 10: Implementere tilbakeringingsrutiner i Java

Utviklere som kjenner til den hendelsesdrevne programmeringsmodellen til MS-Windows og X Window System, er vant til å sende funksjonspekere som blir påkalt (det vil si "kalt tilbake") når noe skjer. Java sin objektorienterte modell støtter foreløpig ikke metodepekere, og ser ut til å utelukke bruk av denne komfortable mekanismen. Men alt er ikke tapt!

Java's støtte til grensesnitt gir en mekanisme der vi kan få tilsvarende tilbakeringing. 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:

offentlig grensesnitt InterestingEvent {// Dette er bare en vanlig metode, slik at den kan returnere noe eller // ta argumenter hvis du vil. offentlig tomrom interessantEvent (); } 

Dette gir oss et grep om gjenstander i klasser som implementere grensesnittet. Så vi trenger ikke bekymre oss for annen fremmed informasjon. Dette er mye finere enn hacking av trampoline C-funksjoner som bruker data felt av widgets for å holde en objektpeker når du bruker C ++ - kode med motiv.

Klassen som signaliserer hendelsen må forvente objekter som implementerer InterestingEvent grensesnitt og deretter påkalle interestingEvent () metode etter behov.

offentlig klasse EventNotifier {private InterestingEvent dvs. privat boolsk noeHappened; public EventNotifier (InterestingEvent event) {// Lagre hendelsesobjektet for senere bruk. dvs. = hendelse; // Ingenting å rapportere ennå. noeHappened = false; } // ... public void doWork () {// Sjekk predikatet, som er angitt andre steder. if (somethingHappened) {// Signaler jevnen ved å påkalle grensesnittets metode. dvs. interessant Intervent (); } // ...} // ...} 

I det eksemplet brukte jeg noe skjedde predikat for å spore om hendelsen skal utløses eller ikke. I mange tilfeller er det nok at metoden ble kalt nok til å garantere signalisering av interestingEvent ().

Koden som ønsker å motta hendelsesvarselet, må implementere InterestingEvent grensesnitt og bare sende en referanse til seg selv til hendelsesvarsler.

offentlig klasse CallMe implementerer InterestingEvent {private EventNotifier no; public CallMe () {// Opprett varsleren og send oss ​​selv til den. no = ny EventNotifier (dette); } // Definer den faktiske behandleren for hendelsen. offentlig tomrom interessantEvent () {// Wow! Noe virkelig interessant må ha skjedd! // Gjør noe... } //... } 

Det er alt det er med det. Jeg håper å bruke dette enkle Java-uttrykket vil gjøre overgangen til Java litt mindre nervøs.

John D. Mitchell har rådført seg med koffein, sukker og for lite søvn de fleste av de siste ni årene, og har utviklet PDA-programvare i OO-monteringsspråk på Geoworks. Han finansierer sin Java-avhengighet ved å skrive kompilatorer, Tcl / Tk, C ++ og Java-systemer. Han var medforfatter av den nye, nye Java-boken Making Sense of Java og utvikler for tiden en Java-kompilator.

Denne historien, "Java Tip 10: Implement callback routines in Java" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found