Programmering

Java Tip 10: Implementer tilbagekaldelsesrutiner i Java

Udviklere, der er fortrolige med den hændelsesstyrede programmeringsmodel af MS-Windows og X Window System, er vant til at videregive funktionspegere, der påberåbes (dvs. "kaldes tilbage"), når der sker noget. Java's objektorienterede model understøtter i øjeblikket ikke metodemarkører og synes således at udelukke brugen af ​​denne behagelige mekanisme. Men alt er ikke tabt!

Java's understøttelse af grænseflader giver en mekanisme, hvormed vi kan få svarende til 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:

offentlig grænseflade InterestingEvent {// Dette er bare en almindelig metode, så den kan returnere noget eller // tage argumenter, hvis du vil. offentlig tom interessantEvent (); } 

Dette giver os et greb om alle objekter af klasser, der implementere grænsefladen. Så vi behøver ikke beskæftige os med andre fremmede oplysninger. Dette er meget pænere end hacking af trampolin C-funktioner, der bruger data felt af widgets til at holde en objektmarkør, når du bruger C ++ - kode med motiv.

Klassen, der signalerer begivenheden, skal forvente objekter, der implementerer Interessant begivenhed interface og derefter påberåbe sig interestingEvent () metode efter behov.

offentlig klasse EventNotifier {private InterestingEvent dvs. privat boolsk noget sket; public EventNotifier (InterestingEvent event) {// Gem begivenhedsobjektet til senere brug. dvs. = begivenhed; // Intet at rapportere endnu. noget skete = falsk; } // ... public void doWork () {// Kontroller prædikatet, der er angivet andetsteds. if (somethingHappened) {// Signalér lige ved at påkalde grænseflades metode. dvs. interessantEvent (); } // ...} // ...} 

I dette eksempel brugte jeg der skete noget prædikat for at spore, om begivenheden skal 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 hændelsesmeddelelsen, skal implementere Interessant begivenhed interface og bare videresende en henvisning til sig selv til hændelsesnotifikatoren.

offentlig klasse CallMe implementerer InterestingEvent {private EventNotifier en; public CallMe () {// Opret begivenhedsmeddeleren og videregiv os selv til den. da = ny EventNotifier (dette); } // Definer den aktuelle handler til begivenheden. public void interestingEvent () {// Wow! Der skal være sket noget rigtig interessant! // Gør noget... } //... } 

Det er alt der er ved det. Jeg håber at bruge dette enkle Java-udtryk vil gøre din overgang til Java lidt mindre nervøs.

John D. Mitchell, der bestod af koffein, sukker og for lidt søvn, har konsulteret det meste af de sidste ni år og har udviklet PDA-software i OO-samlingssprog på Geoworks. Han finansierer sin Java-afhængighed ved at skrive kompilatorer, Tcl / Tk, C ++ og Java-systemer. Han var medforfatter til den hotte nye Java-bog Making Sense of Java og er i øjeblikket ved at udvikle en Java-compiler.

Denne historie, "Java Tip 10: Implementere tilbagekaldningsrutiner i Java" blev oprindeligt udgivet af JavaWorld.