logo

Devolució de trucada mitjançant interfícies a Java

Devolució de trucada en C/C++: El mecanisme per cridar una funció des d'una altra funció s'anomena callback. L'adreça de memòria d'una funció es representa com a "punter de funció" en llenguatges com C i C++. Per tant, la devolució de trucada s'aconsegueix passant el punter de function1() a function2().
Devolució de trucada en Java: Però el concepte de funció de devolució de trucada no existeix a Java perquè Java no té concepte de punter. Tanmateix, hi ha situacions en què es podria parlar d'un objecte de devolució de trucada o d'una interfície de devolució de trucada. En lloc de passar l'adreça de memòria d'una funció es passa una interfície que fa referència a la ubicació d'una funció.
 

Exemple


Prenguem un exemple per entendre on es poden utilitzar les devolució de trucades. Suposem que un programador vol dissenyar una calculadora d'impostos que calculi l'impost total d'un estat. Suposem que només hi ha dos impostos central i estatal. L'impost central és comú mentre que l'impost estatal varia d'un estat a un altre. L'impost total és la suma dels dos. Aquí s'implementa un mètode separat com stateTax() per a cada estat i crida aquest mètode des d'un altre mètode calculateTax() com:
 



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


En el codi anterior, l'adreça de stateTax() es passa a calculateTax(). El mètode calculateTax() utilitzarà aquesta adreça per cridar al mètode stateTax() d'un estat concret i es calcula l'impost estatal "st". 
Com que el codi del mètode stateTax() canvia d'un estat a un altre, és millor declarar-lo com a mètode abstracte en una interfície com: 
 

interface STax { double stateTax(); }


El següent és la implementació de stateTax() per a l'estat de Punjab: 
 

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


A continuació es mostra la implementació de stateTax() per a l'estat d'HP: 
 

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


Ara el mètode calculateTax() es pot dissenyar com: 
 

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

Aquí observeu el paràmetre 'STax t' al mètode calculateTax(). 't' és una referència de la interfície 'STax' que es passa com a paràmetre al mètode. Utilitzant aquesta referència, el mètode stateTax() s'anomena com: 
 

double st = t.stateTax();


Aquí, si "t" es refereix al mètode stateTax() de la classe Punjab, s'anomena aquest mètode i es calcula el seu impost. De la mateixa manera per a la classe HP. D'aquesta manera, passant la referència de la interfície al mètode calculateTax() és possible cridar al mètode stateTax() de qualsevol estat. Això es diu mecanisme de devolució de trucada.
En passar la referència de la interfície que fa referència a un mètode, és possible cridar i utilitzar aquest mètode des d'un altre mètode.
 

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

Sortida: 
 

Enter the state name Punjab Total tax = 5000.0


Referències: 
Com implementar funcions de devolució de trucada a Java?  
Core Java: un enfocament integrat

Crea un qüestionari