Sfat Java 10: implementați rutine de apel invers în Java

dezvoltatorii familiarizați cu modelul de programare bazat pe evenimente al MS-Windows și Sistemul X Window sunt obișnuiți să transmită indicii de funcții care sunt invocate (adică „numite înapoi”) atunci când se întâmplă ceva. Modelul orientat pe obiecte Java nu acceptă în prezent indicii de metodă și, prin urmare, pare să excludă utilizarea acestui mecanism confortabil. Dar totul nu este pierdut!

suportul Java pentru interfețe oferă un mecanism prin care putem obține echivalentul apelurilor. Trucul este să definim o interfață simplă care declară metoda pe care dorim să o invocăm.

de exemplu, să presupunem că dorim să fim anunțați când se întâmplă un eveniment. Putem defini o interfață:

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

acest lucru ne oferă o prindere pe orice obiecte de clase care implementează interfața. Deci, nu trebuie să ne preocupe cu orice alte informații de tip străine. Acest lucru este mult mai plăcut decât hacking funcții trambulină C care utilizează câmpul de date de widget-uri pentru a deține un pointer obiect atunci când se utilizează C++ cod cu motiv.

clasa care va semnala evenimentul trebuie să aștepte obiecte care implementează interfața InterestingEvent și apoi invocă metoda interestingEvent (), după caz.

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

în acest exemplu, am folosit predicatul somethingHappened pentru a urmări dacă evenimentul ar trebui sau nu declanșat. În multe cazuri, însăși faptul că metoda a fost numit este suficient pentru a justifica semnalizarea interestingEvent().

codul care dorește să primească notificarea evenimentului trebuie să implementeze interfața InterestingEvent și să transmită doar o referință la el însuși notificatorului evenimentului.

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

asta e tot ce este acolo. Sper folosi acest simplu idiom Java va face trecerea la Java Un pic mai puțin nervozitate.

Subzistând pe cofeină, zahăr și prea puțin somn, John D. Mitchell a fost consultant pentru mostof în ultimii nouă ani și a dezvoltat software-ul PDA în limbajul OOassembly la Geoworks. El își finanțează dependența de Java scriind compilatoare, Tcl / Tk, C++ și sisteme Java. El a coautor thehot New Java book Making Sense of Javași dezvoltă în prezent un compilator Java.

Lasă un răspuns

Adresa ta de email nu va fi publicată.