Java Tip 10: toteuta takaisinsoittorutiinit Javassa

MS-Windowsin tapahtumapohjaisessa ohjelmointimallissa ja X-Ikkunajärjestelmässä ovat tottuneet siirtämään funktion osoittimia, joita kutsutaan (eli ”kutsutaan takaisin”), kun jotain tapahtuu. Javan olio-orientoitunut malli ei tällä hetkellä tue menetelmäosoittimia, ja näyttää siten estävän tämän mukavan mekanismin käytön. Mutta kaikki ei ole menetetty!

Javan tuki rajapinnoille tarjoaa mekanismin, jonka avulla voimme saada vastaavan takaisinkutsun. Temppu on määritellä yksinkertainen käyttöliittymä, joka ilmoittaa menetelmän haluamme vedota.

Oletetaan esimerkiksi, että haluamme saada ilmoituksen, kun jokin tapahtuma tapahtuu. Voimme määritellä käyttöliittymän:

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

tämä antaa meille otteen objekteja luokkien, jotka toteuttavat käyttöliittymän. Meidän ei siis tarvitse huolehtia mistään muusta ulkopuolisesta tiedosta. Tämä on paljon mukavampi kuin hakkerointi trampoliini C toimintoja, jotka käyttävät tietokenttää widgetit pitää objektin osoitin käytettäessä C++ – koodia Motif.

tapahtuman signaloivan luokan on varauduttava olioihin, jotka toteuttavat InterestingEvent-rajapinnan ja sen jälkeen turvauduttava tapauksen mukaan interestingEvent () – menetelmään.

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

tässä esimerkissä käytin somethingHappened-predikaattia seuratakseni, pitäisikö tapahtuma laukaista vai ei. Monissa tapauksissa jo se, että menetelmää kutsuttiin, riittää osoittamaan kiinnostavan tapahtuman().

koodin, joka haluaa vastaanottaa tapahtumailmoituksen, on otettava käyttöön kiinnostava tapahtumarajapinta ja välitettävä vain viittaus itseensä tapahtuman ilmoittajalle.

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

siinä kaikki. Toivon käyttää tätä yksinkertaista Java idiomi tekee siirtyminen Java hieman vähemmän hermostunut.

kofeiini, sokeri ja liian vähän unta, John D. Mitchell on konsultoinut mostof viimeiset yhdeksän vuotta, ja on kehittänyt PDA ohjelmisto OOassembly kielellä Geoworks. Hän rahoittaa Java-riippuvuuttaan kirjoittamalla kääntäjiä, Tcl / Tk, C++ ja Java-järjestelmiä. Hän coautored thehot Uusi Java Kirja Making Sense of Java ja on parhaillaan kehittämässä Java-kääntäjä.

Vastaa

Sähköpostiosoitettasi ei julkaista.