Zpětné volání v C/C++: Mechanismus volání funkce z jiné funkce se nazývá zpětné volání. Paměťová adresa funkce je v jazycích jako C a C++ reprezentována jako „ukazatel funkce“. Takže zpětného volání je dosaženo předáním ukazatele funkce1() na funkci2().
Zpětné volání v Javě: Ale koncept funkce zpětného volání v Javě neexistuje, protože Java nemá koncept ukazatele. Existují však situace, kdy by se dalo mluvit o objektu zpětného volání nebo rozhraní zpětného volání. Místo předávání adresy paměti funkce rozhraní, které odkazuje na umístění funkce.
Příklad
hranatý materiál
Vezměme si příklad, abychom pochopili, kde lze zpětná volání použít. Předpokládejme, že programátor chce navrhnout daňovou kalkulačku, která vypočítá celkovou daň státu. Předpokládejme, že existují pouze dvě daně centrální a státní. Centrální daň je běžná, zatímco státní daň se v jednotlivých státech liší. Celková daň je součtem těchto dvou. Zde je pro každý stav implementována samostatná metoda jako stateTax() a volání této metody z jiné metody vypočtěteTax() jako:
static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }
V předchozím kódu je adresa stateTax() předána k výpočtuTax(). Metoda vypočtěteTax() použije tuto adresu k zavolání metody stateTax() konkrétního státu a vypočítá se státní daň ‚st‘.
Protože se kód metody stateTax() mění z jednoho stavu do druhého, je lepší ji deklarovat jako abstraktní metodu v rozhraní jako:
interface STax { double stateTax(); }
Následuje implementace stateTax() pro stát Paňdžáb:
class Punjab implements STax{ public double stateTax(){ return 3000.0; } }
Následuje implementace stateTax() pro stav HP:
class HP implements STax { public double stateTax() { return 1000.0; } }
Nyní může být metoda countTax() navržena jako:
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); } Zde sledujte parametr ‚STax t‘ v metodě vypočtěteTax(). „t“ je odkaz na rozhraní „STax“, který je předán jako parametr metodě. Pomocí tohoto odkazu se metoda stateTax() nazývá:
css tučný text
double st = t.stateTax();
Pokud „t“ odkazuje na metodu stateTax() třídy Pandžáb, pak se tato metoda zavolá a vypočítá se její daň. Podobně pro třídu HP. Tímto způsobem předáním odkazu na rozhraní do metody countTax() je možné volat metodu stateTax() libovolného stavu. Tomu se říká mechanismus zpětného volání.
Předáním odkazu na rozhraní, který odkazuje na metodu, je možné volat a používat tuto metodu z jiné metody.
// 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); } }
výstup:
Enter the state name Punjab Total tax = 5000.0
Reference:
Jak implementovat funkce zpětného volání v Javě?
Jádro Java: Integrovaný přístup