logo

Apel invers folosind interfețele în Java

Apel invers în C/C++: Mecanismul de apelare a unei funcții dintr-o altă funcție se numește callback. Adresa de memorie a unei funcții este reprezentată ca „indicator de funcție” în limbaje precum C și C++. Așadar, callback-ul este realizat prin trecerea pointerului funcției1() la funcția2().
Apel invers în Java: Dar conceptul de funcție de apel invers nu există în Java, deoarece Java nu are conceptul de pointer. Cu toate acestea, există situații în care s-ar putea vorbi de un obiect de apel invers sau de o interfață de apel invers. În loc să treci adresa de memorie a unei funcții este transmisă interfața care se referă la locația unei funcții.
 

Exemplu


Să luăm un exemplu pentru a înțelege unde pot fi folosite apelurile inverse. Să presupunem că un programator dorește să proiecteze un calculator de taxe care calculează impozitul total al unui stat. Să presupunem că există doar două taxe centrale și impozit de stat. Impozitul central este comun, în timp ce impozitul de stat variază de la un stat la altul. Impozitul total este suma celor două. Aici o metodă separată precum stateTax() este implementată pentru fiecare stat și apelează această metodă dintr-o altă metodă calculateTax() ca:
 



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


În codul precedent, adresa stateTax() este transmisă calculateTax(). Metoda calculateTax() va folosi acea adresă pentru a apela metoda stateTax() a unui anumit stat și se calculează impozitul de stat „st”. 
Deoarece codul metodei stateTax() se schimbă de la o stare la alta, este mai bine să o declarați ca metodă abstractă într-o interfață ca: 
 

do while loop în java
interface STax { double stateTax(); }


Următoarea este implementarea stateTax() pentru statul Punjab: 
 

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


Următoarea este implementarea stateTax() pentru starea HP: 
 

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


Acum metoda calculateTax() poate fi proiectată astfel: 
 

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

Aici observați parametrul „STax t” în metoda calculateTax(). „t” este o referință a interfeței „STax” care este transmisă ca parametru metodei. Folosind această referință, metoda stateTax() este numită ca: 
 

double st = t.stateTax();


Aici, dacă „t” se referă la metoda stateTax() din clasa Punjab, atunci acea metodă este numită și impozitul ei este calculat. La fel și pentru clasa HP. În acest fel, prin trecerea referinței interfeței la metoda calculateTax() este posibil să apelați metoda stateTax() a oricărei stări. Aceasta se numește mecanism de apel invers.
Prin trecerea referinței de interfață care se referă la o metodă este posibil să apelați și să utilizați acea metodă dintr-o altă 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);  } } 

Ieșire: 
 

Enter the state name Punjab Total tax = 5000.0


Referinte: 
Cum se implementează funcțiile de apel invers în Java?  
Core Java: o abordare integrată

Creați un test