Povratni poziv u C/C++: Mehanizam pozivanja funkcije iz druge funkcije naziva se povratni poziv. Memorijska adresa funkcije predstavljena je kao 'pokazivač funkcije' u jezicima poput C i C++. Dakle, povratni poziv se postiže prosljeđivanjem pokazivača funkcije1() na funkciju2().
Povratni poziv u Javi: Ali koncept funkcije povratnog poziva ne postoji u Javi jer Java nema koncept pokazivača. Međutim, postoje situacije u kojima se može govoriti o objektu povratnog poziva ili sučelju povratnog poziva. Umjesto prosljeđivanja memorijske adrese funkcije prosljeđuje se sučelje koje se odnosi na lokaciju funkcije.
Primjer
Uzmimo primjer da bismo razumjeli gdje se povratni pozivi mogu koristiti. Pretpostavimo da programer želi dizajnirati porezni kalkulator koji izračunava ukupni porez države. Pretpostavimo da postoje samo dva poreza središnji i državni porez. Središnji porez je uobičajen, dok se državni porez razlikuje od jedne države do druge. Ukupni porez je zbroj ta dva. Ovdje se zasebna metoda kao što je stateTax() implementira za svaku državu i poziva ovu metodu iz druge metode izračunaTax() kao:
static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }
U prethodnom kodu adresa stateTax() prosljeđuje se izračunTax(). Metoda calculateTax() koristit će tu adresu za pozivanje metode stateTax() određene države i izračunava se državni porez 'st'.
Budući da se kod metode stateTax() mijenja iz jednog stanja u drugo, bolje ju je deklarirati kao apstraktnu metodu u sučelju kao:
interface STax { double stateTax(); }
Slijedi implementacija stateTax() za državu Punjab:
class Punjab implements STax{ public double stateTax(){ return 3000.0; } }
Slijedi implementacija stateTax() za HP državu:
class HP implements STax { public double stateTax() { return 1000.0; } }
Sada se metoda izračunaTax() može dizajnirati kao:
static void calculateTax(STax t) { // calculate central tax double ct = 2000.0; // calculate state tax double st = t.stateTax(); double totaltax = st + ct; // display total tax System.out.println(Total tax =+totaltax); } Ovdje promatrajte parametar 'STax t' u metodi calculateTax(). 't' je referenca sučelja 'STax' koja se prosljeđuje kao parametar metodi. Korištenjem ove reference metoda stateTax() se poziva kao:
double st = t.stateTax();
Ovdje ako se 't' odnosi na metodu stateTax() klase Punjab, tada se ta metoda poziva i njezin se porez izračunava. Slično za klasu HP. Na ovaj način prosljeđivanjem reference sučelja metodi calculateTax() moguće je pozvati metodu stateTax() bilo koje države. Ovo se zove mehanizam povratnog poziva.
Prolaskom reference sučelja koja se odnosi na metodu moguće je pozvati i koristiti tu metodu iz druge metode.
// Java program to demonstrate callback mechanism // using interface is Java // Create interface import java.util.Scanner; interface STax { double stateTax(); } // Implementation class of Punjab state tax class Punjab implements STax { public double stateTax() { return 3000.0; } } // Implementation class of Himachal Pradesh state tax class HP implements STax { public double stateTax() { return 1000.0; } } class TAX { public static void main(String[] args) throws ClassNotFoundException IllegalAccessException InstantiationException { Scanner sc = new Scanner(System.in); System.out.println('Enter the state name'); String state = sc.next(); // name of the state // The state name is then stored in an object c Class c = Class.forName(state); // Create the new object of the class whose name is in c // Stax interface reference is now referencing that new object STax ref = (STax)c.newInstance(); /*Call the method to calculate total tax and pass interface reference - this is callback . Here ref may refer to stateTax() of Punjab or HP classes depending on the class for which the object is created in the previous step */ calculateTax(ref); } static void calculateTax(STax t) { // calculate central tax double ct = 2000.0; // calculate state tax double st = t.stateTax(); double totaltax = st + ct; // display total tax System.out.println('Total tax =' + totaltax); } }
Izlaz:
Enter the state name Punjab Total tax = 5000.0
Reference:
Kako implementirati funkcije povratnog poziva u Javi?
Core Java: integrirani pristup