Vývojári, ktorí poznajú programovací model založený na udalostiach v prostredí MS-Windows a X Window System, sú zvyknutí posielať ukazovatele funkcií, ktoré sa vyvolajú (tj. „Zavolajú späť“), keď sa niečo stane. Objektovo orientovaný model Java v súčasnosti nepodporuje ukazovatele metód, a tak sa zdá, že vylučuje použitie tohto pohodlného mechanizmu. Ale všetko nie je stratené!
Podpora Java pre rozhrania poskytuje mechanizmus, pomocou ktorého môžeme získať ekvivalent spätných volaní. Trik spočíva v definovaní jednoduchého rozhrania, ktoré deklaruje metódu, ktorú si želáme vyvolať.
Predpokladajme napríklad, že chceme byť informovaní, keď dôjde k udalosti. Môžeme definovať rozhranie:
verejné rozhranie InterestingEvent {// Toto je len bežná metóda, takže môže niečo vrátiť alebo // vziať argumenty, ak sa vám páči. public void interestingEvent (); }
Takto získame kontrolu nad akýmikoľvek objektmi tried, ktoré realizovať rozhranie. Takže sa nemusíme zaoberať žiadnymi ďalšími informáciami o cudzom type. Toto je veľa krajšie ako hackovanie trampolínových C funkcií, ktoré využívajú údaje pole widgetov na držanie ukazovateľa objektu pri použití kódu C ++ s Motifom.
Trieda, ktorá bude signalizovať udalosť, musí očakávať objekty, ktoré implementujú ZaujímavýEvent rozhranie a potom vyvolať interestingEvent () podľa potreby.
verejná trieda EventNotifier {private InterestingEvent ie; private boolean somethingStalo sa; public EventNotifier (InterestingEvent event) {// Uložte objekt udalosti pre neskoršie použitie. tj = udalosť; // Zatiaľ nie je čo hlásiť. somethingHappened = false; } // ... public void doWork () {// Skontrolujte predikát, ktorý je nastavený inde. if (somethingHappened) {// Signál párny vyvolaním metódy rozhrania. tj.zajímavýEvent (); } // ...} // ...}
V tomto príklade som použil niečo sa stalo predikát na sledovanie, či sa má alebo nemá udalosť spustiť. V mnohých prípadoch samotná skutočnosť, že sa metóda volala, stačí na zabezpečenie signalizácie interestingEvent ().
Kód, ktorý si želá dostávať oznámenia o udalosti, musí implementovať ZaujímavýEvent rozhranie a stačí odoslať odkaz na seba oznamovateľovi udalosti.
verejná trieda CallMe implementuje InterestingEvent {private EventNotifier en; public CallMe () {// Vytvorte oznamovateľa udalosti a odovzdajte sa mu. sk = nový EventNotifier (tento); } // Definujte skutočný obslužný program udalosti. public void interestingEvent () {// Páni! Muselo sa stať niečo skutočne zaujímavé! // Urob niečo... } //... }
To je všetko. Dúfam, že použitie tohto jednoduchého idiómu Java spôsobí, že váš prechod na Javu bude o niečo menej nervózny.
John D. Mitchell, ktorý sa živí kofeínom, cukrom a príliš malým spánkom, konzultuje väčšinu z posledných deviatich rokov a vyvinul softvér PDA v jazyku OO assembleri v spoločnosti Geoworks. Financuje svoju závislosť na Jave písaním kompilátorov, systémov Tcl / Tk, C ++ a Java. Spoluautorom horúcej novej knihy v jazyku Java Making Sense of Java a v súčasnosti vyvíja kompilátor Java.Tento príbeh, „Java Tip 10: Implementujte rutiny spätného volania v Jave“, bol pôvodne publikovaný spoločnosťou JavaWorld.