Programovanie

Tip Java 10: Implementujte rutiny spätného volania v jazyku Java

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.

$config[zx-auto] not found$config[zx-overlay] not found