Java Tip 10: Implementer tilbagekaldsrutiner i Java

udviklere, der er fortrolige med den begivenhedsdrevne programmeringsmodel af MS-vinduer og vinduet System er vant til at passere funktionspegere, der påberåbes (det vil sige “kaldet tilbage”), når der sker noget. Java ‘ s objektorienterede model understøtter i øjeblikket ikke metodepegere og synes således at udelukke at bruge denne behagelige mekanisme. Men alt er ikke tabt!

Java ‘ s understøttelse af grænseflader giver en mekanisme, hvormed vi kan få ækvivalent med tilbagekald. Tricket er at definere en simpel grænseflade, der erklærer den metode, vi ønsker at blive påberåbt.

Antag for eksempel, at vi vil have besked, når en begivenhed sker. Vi kan definere en grænseflade:

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

dette giver os et greb om alle objekter af klasser, der implementerer grænsefladen. Så, vi behøver ikke bekymre os om andre fremmede oplysninger. Dette er meget pænere end hacking trampolin C-funktioner, der bruger datafeltet for kontroller til at holde en objektpeger, når du bruger C++ – kode med Motif.

den klasse, der signalerer begivenheden, skal forvente objekter, der implementerer InterestingEvent-grænsefladen og derefter påberåbe sig interestingEvent () – metoden efter 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 eksempel brugte jeg det noget, der skete, til at spore, om begivenheden skulle udløses eller ej. I mange tilfælde er selve det faktum, at metoden blev kaldt, nok til at berettige signalering af interestingEvent().

koden, der ønsker at modtage begivenhedsmeddelelsen, skal implementere InterestingEvent-grænsefladen og bare videregive en henvisning til sig selv til begivenhedsmeddeleren.

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, hvad der er til det. Jeg håber at bruge dette enkle Java-idiom vil gøre din overgang til Java lidt mindre nervøs.

John D. Mitchell har været konsulent i de fleste af de sidste ni år og har udviklet PDA-programmer i OOassembly-sprog på Geoarbejder . Han finansierer sin Java-afhængighed ved at skrive kompilatorer, Tcl / Tk, C++ og Java-systemer. Han var medforfatter til den nye Java-bog, der giver mening om Javaog udvikler i øjeblikket en Java-kompilator.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.