logo

Återuppringning med gränssnitt i Java

Mekanismen för att anropa en funktion från en annan funktion kallas återuppringning. Minnesadress för en funktion representeras som "funktionspekare" i språk som C och C++. Så återuppringningen uppnås genom att skicka pekaren för funktion1() till funktion2().
Återuppringning i Java: Men konceptet med en återuppringningsfunktion existerar inte i Java eftersom Java inte har ett pekarkoncept. Det finns dock situationer där man kan tala om ett callback-objekt eller ett callback-gränssnitt. Istället för att skicka minnesadressen till en funktion gränssnitt skickas som hänvisar till platsen för en funktion.
 

Exempel

android.process.acore stannar hela tiden


Låt oss ta ett exempel för att förstå var återuppringningar kan användas. Anta att en programmerare vill designa en skattekalkylator som beräknar total skatt för en stat. Antag att det bara finns två skatter central- och statlig skatt. Central skatt är vanlig medan den statliga skatten varierar från en stat till en annan. Den totala skatten är summan av de två. Här implementeras separat metod som stateTax() för varje stat och anropar denna metod från en annan metod calculateTax() som:
 



static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }


I den föregående koden skickas adressen till stateTax() till calculateTax(). Metoden calculateTax() kommer att använda den adressen för att anropa stateTax()-metoden för en viss stat och statens skatt "st" beräknas. 
Eftersom koden för metoden stateTax() ändras från ett tillstånd till ett annat är det bättre att deklarera den som en abstrakt metod i ett gränssnitt som: 
 

interface STax { double stateTax(); }


Följande är implementeringen av stateTax() för delstaten Punjab: 
 

class Punjab implements STax{ public double stateTax(){ return 3000.0; } }


Följande är implementeringen av stateTax() för HP-staten: 
 

class HP implements STax { public double stateTax() { return 1000.0; } }


Nu kan calculateTax()-metoden utformas som: 
 

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); }

Observera här parametern 'STax t' i calculateTax()-metoden. 't' är en referens till 'STax'-gränssnittet som skickas som en parameter till metoden. Med denna referens kallas metoden stateTax() som: 

lokaldatum
double st = t.stateTax();


Här om 't' hänvisar till stateTax()-metoden av klassen Punjab, anropas den metoden och dess skatt beräknas. Likadant för klass HP. På detta sätt genom att skicka gränssnittsreferens till calculateTax()-metoden är det möjligt att anropa stateTax()-metoden för vilken stat som helst. Detta kallas återuppringningsmekanism.
Genom att skicka gränssnittsreferensen som refererar till en metod är det möjligt att anropa och använda den metoden från en annan metod.
 

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

Produktion: 
 

Enter the state name Punjab Total tax = 5000.0


Referenser: 
Hur implementerar man callback-funktioner i Java?  
Core Java: En integrerad metod

Skapa frågesport