Съвет 10 на Java: Внедрете подпрограми за обратно извикване в Java

Разработчиците, запознати с модела за програмиране, управляван от събития, на MS-Windows и X Window System са свикнали да предават указатели на функции, които се извикват (т.е. „извикват“), когато нещо се случи. Обектно-ориентираният модел на Java понастоящем не поддържа указатели на методи и по този начин изглежда изключва използването на този удобен механизъм. Но всичко не е загубено!

Поддръжката на Java за интерфейси осигурява механизъм, чрез който можем да получим еквивалента на обратно извикване. Номерът е да се определи прост интерфейс, който декларира метода, който искаме да бъде извикан.

Да предположим например, че искаме да бъдем уведомени, когато се случи събитие. Можем да определим интерфейс:

публичен интерфейс InterestingEvent {// Това е само обикновен метод, за да може да върне нещо или // да вземе аргументи, ако искате. public void interestingEvent (); }

Това ни дава възможност да се възползваме от всички обекти на класове, които изпълняват интерфейса. Така че, не е необходимо да се занимаваме с каквато и да е друга информация от външен тип. Това е много по-хубаво от хакване на батут C функции, които използват полето за данни на приспособленията, за да държат указател на обект, когато използват C ++ код с Motif.

Класът, който ще сигнализира за събитието, трябва да очаква обекти, които реализират интерфейса InterestingEvent и след това да извика метода interestingEvent () според случая.

публичен клас EventNotifier {private InterestingEvent т.е. private boolean somethingHappened; public EventNotifier (InterestingEvent event) {// Запазете обекта на събитието за по-късна употреба. т.е. = събитие; // Все още няма нищо за отчитане. somethingHappened = false; } // ... public void doWork () {// Проверете предиката, който е зададен другаде. if (somethingHappened) {// Сигнализирайте дори чрез извикване на метода на интерфейса. т.е.интересно събитие (); } // ...} // ...}

В този пример използвах предиката somethingHappened, за да проследя дали събитието трябва да се задейства или не. В много случаи самият факт, че методът е извикан, е достатъчен, за да оправдае сигнализирането на interestingEvent () .

Кодът, който желае да получи известие за събитие, трябва да внедри интерфейса InterestingEvent и просто да предаде препратка към себе си на известието за събитие.

публичен клас CallMe реализира InterestingEvent {private EventNotifier bg; public CallMe () {// Създайте известие за събитие и се предайте на него. bg = нов EventNotifier (този); } // Определете действителния манипулатор за събитието. public void interestingEvent () {// Уау! Трябва да се е случило нещо наистина интересно! // Направи нещо... } //... }

Това е всичко. Надявам се, че използването на този прост Java идиом ще направи вашия преход към Java малко по-малко нервен.

Издържайки се на кофеин, захар и твърде малко сън, Джон Д. Мичъл консултира през по-голямата част от последните девет години и е разработил PDA софтуер на асемблерен език на OO в Geoworks. Той финансира пристрастяването си към Java, като пише компилатори, Tcl / Tk, C ++ и Java системи. Той е съавтор на новата гореща книга за Java „Осъзнаване на Java“ и в момента разработва компилатор на Java.

Тази история „Java Tip 10: Внедряване на подпрограми за обратно извикване в Java“ първоначално е публикувана от JavaWorld.