Java Tip 10: Realizovat zpětné volání rutiny v jazyce Java

Vývojáři vyznat se v event-driven programming model MS-Windows a X Window System jsou zvyklí na předávání ukazatele na funkce, které jsou uplatňovány (to je, „volal zpět“), když se něco stane. Objektově orientovaný model Java v současné době nepodporuje ukazatele metod, a proto se zdá, že vylučuje použití tohoto pohodlného mechanismu. Ale vše není ztraceno!

Podpora rozhraní Java 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 chceme vyvolat.

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

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

To nám dává přilnavost na všechny objekty tříd, které implementují rozhraní. Takže se nemusíme zabývat žádnými dalšími informacemi o cizím typu. To je mnohem hezčí než hacking trampolína C funkce, které používají datové pole widgetů držet ukazatel objektu při použití C++ kód s Motif.

třída, která bude signalizovat událost, musí očekávat objekty, které implementují interface InterestingEvent, a poté podle potřeby vyvolat metodu interestingEvent ().

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

V tomto příkladu jsem použil predikát somethingHappened ke sledování, zda má být událost spuštěna. V mnoha případech stačí samotná skutečnost, že metoda byla volána, aby byla zaručena signalizace zajímavéudálost().

kód, který si přeje dostávat oznámení o události, musí implementovat rozhraní InterestingEvent a jednoduše předat odkaz na sebe oznamovateli události.

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

to je vše, co je k tomu. Doufám, že použití tohoto jednoduchého Java idiom bude váš přechod na Javu o něco méně nervózní.

Jsoucímu na kofeinu, cukru a příliš málo spánku, John D. Mitchell má být poradenství pro většina posledních devět let, a vyvinula PDA software v OOassembly jazyk na Geoworks. On financuje jeho Java závislost bywriting kompilátory, Tcl / Tk, C++, a Java systémy. Spoluautor thehot nová Java Kniha Making Sense of Javaa v současné době vyvíjí kompilátor Java.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.