logo

Terugbellen met behulp van interfaces in Java

Terugbellen in C/C++: Het mechanisme voor het aanroepen van een functie vanuit een andere functie wordt callback genoemd. Het geheugenadres van een functie wordt weergegeven als ‘functieaanwijzer’ in talen als C en C++. De callback wordt dus bereikt door de pointer van function1() door te geven aan function2().
Terugbellen in Java: Maar het concept van een callback-functie bestaat niet in Java omdat Java geen pointer-concept heeft. Er zijn echter situaties waarin men zou kunnen spreken van een callback-object of een callback-interface. In plaats van het geheugenadres van een functie door te geven interface doorgegeven die verwijst naar de locatie van een functie.
 

Voorbeeld

wat is 10 van de 100


Laten we een voorbeeld nemen om te begrijpen waar callbacks kunnen worden gebruikt. Stel dat een programmeur een belastingcalculator wil ontwerpen die de totale belasting van een staat berekent. Stel dat er slechts twee belastingen zijn: een centrale belasting en een staatsbelasting. Centrale belasting is gebruikelijk, terwijl de staatsbelasting van staat tot staat varieert. De totale belasting is de som van beide. Hier wordt voor elke staat een aparte methode zoals stateTax() geïmplementeerd en roep deze methode vanuit een andere methode computationTax() aan als:
 



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


In de voorgaande code wordt het adres van stateTax() doorgegeven aan computationTax(). De methode 'calculTax()' zal dat adres gebruiken om de methode stateTax() van een bepaalde staat aan te roepen en de staatsbelasting 'st' wordt berekend. 
Omdat de code van de methode stateTax() van de ene staat naar de andere verandert, is het beter om deze als een abstracte methode in een interface te declareren als: 
 

interface STax { double stateTax(); }


Het volgende is de implementatie van stateTax() voor de staat Punjab: 
 

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


Het volgende is de implementatie van stateTax() voor HP State: 
 

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


Nu kan de methode 'calculTax()' als volgt worden ontworpen: 
 

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

Bekijk hier de parameter ‘STax t’ in de methode ‘calculTax(’). ‘t’ is een referentie van de ‘STax’-interface die als parameter aan de methode wordt doorgegeven. Met behulp van deze referentie wordt de methode stateTax() aangeroepen als: 
 

mysql show-gebruikers
double st = t.stateTax();


Als ‘t’ hier verwijst naar de stateTax()-methode van klasse Punjab, wordt die methode aangeroepen en wordt de belasting berekend. Hetzelfde geldt voor klasse HP. Op deze manier is het mogelijk om de stateTax()-methode van elke staat aan te roepen, door een interfaceverwijzing door te geven aan de methode berekenenTax(). Dit wordt genoemd terugbelmechanisme.
Door de interfacereferentie door te geven die naar een methode verwijst, is het mogelijk om die methode vanuit een andere methode aan te roepen en te gebruiken.
 

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

Uitgang: 
 

Enter the state name Punjab Total tax = 5000.0


Referenties: 
Hoe callback-functies in Java implementeren?  
Kern-Java: een geïntegreerde aanpak

Quiz maken