Programování

Tip Java 10: Implementujte rutiny zpětného volání v Javě

Vývojáři ovládající model programování řízený událostmi systému MS-Windows a X Window System jsou zvyklí předávat ukazatele funkcí, které jsou vyvolány (tj. „Zavolány zpět“), když se něco stane. Objektově orientovaný model Java aktuálně nepodporuje ukazatele metod, a tak se zdá, že vylučuje použití tohoto pohodlného mechanismu. Ale vše není ztraceno!

Java podporuje rozhraní poskytuje mechanismus, kterým můžeme získat ekvivalent zpětných volání. Trik spočívá v definování jednoduchého rozhraní, které deklaruje metodu, kterou si přejeme vyvolat.

Předpokládejme například, že chceme být upozorněni, když dojde k události. Můžeme definovat rozhraní:

veřejné rozhraní InterestingEvent {// Toto je jen běžná metoda, takže může něco vrátit nebo // převzít argumenty, pokud chcete. public void interestingEvent (); } 

To nám umožňuje sevření všech předmětů tříd, které nářadí rozhraní. Takže se nemusíme starat o žádné další informace o cizím typu. Tohle je hodně hezčí než hackování trampolínových funkcí C, které používají data pole widgetů pro držení ukazatele objektu při použití C ++ kódu s Motif.

Třída, která bude signalizovat událost, musí očekávat objekty, které implementují Zajímavá událost rozhraní a poté vyvolat interestingEvent () podle potřeby.

public class EventNotifier {private InterestingEvent ie; soukromé booleovské něco Stalo se; public EventNotifier (InterestingEvent event) {// Uložte objekt události pro pozdější použití. tj. = událost; // Zatím nic k hlášení. somethingHappened = false; } // ... public void doWork () {// Zkontrolujte predikát, který je nastaven jinde. if (somethingHappened) {// Signál sudého vyvoláním metody rozhraní. tj. interestingEvent (); } // ...} // ...} 

V tomto příkladu jsem použil něco se stalo predikát ke sledování, zda má být událost spuštěna či nikoli. V mnoha případech samotná skutečnost, že byla metoda volána, stačí k signalizaci interestingEvent ().

Kód, který si přeje dostávat oznámení o události, musí implementovat Zajímavá událost rozhraní a stačí předat odkaz na sebe oznamovateli události.

veřejná třída CallMe implementuje InterestingEvent {private EventNotifier en; public CallMe () {// Vytvořte oznamovatele události a předejte se mu. en = nový EventNotifier (tento); } // Definujte skutečný obslužný program události. public void interestingEvent () {// Páni! Muselo dojít k něčemu opravdu zajímavému! // Dělej něco... } //... } 

To je vše. Doufám, že použití tohoto jednoduchého idiomu Java způsobí váš přechod na Javu o něco méně nervózní.

John D. Mitchell, který se živí kofeinem, cukrem a příliš malým spánkem, konzultuje většinu z posledních devíti let a vyvinul software PDA v montážním jazyce OO v Geoworks. Financuje svou závislost na Javě psaním překladačů, systémů Tcl / Tk, C ++ a Java. Spoluautorem nové horké knihy Java Making Sense of Java a v současné době vyvíjí kompilátor Java.

Tento příběh, „Java Tip 10: Implementujte rutiny zpětného volání v Javě“, původně publikoval JavaWorld.