logo

Повратни позив коришћењем интерфејса у Јави

Повратни позив у Ц/Ц++: Механизам позивања функције из друге функције назива се повратни позив. Меморијска адреса функције је представљена као „показивач функције“ у језицима као што су Ц и Ц++. Дакле, повратни позив се постиже прослеђивањем показивача функције1() на функцију2().
Повратни позив у Јави: Али концепт функције повратног позива не постоји у Јави јер Јава нема концепт показивача. Међутим, постоје ситуације у којима се може говорити о објекту повратног позива или интерфејсу повратног позива. Уместо прослеђивања меморијске адресе функције прослеђује се интерфејс који се односи на локацију функције.
 

Пример


Узмимо пример да разумемо где се могу користити повратни позиви. Претпоставимо да програмер жели да дизајнира порески калкулатор који израчунава укупан порез државе. Претпоставимо да постоје само два пореза централни и државни порез. Централни порез је уобичајен док се државни порез разликује од једне државе до друге. Укупан порез је збир та два. Овде је засебна метода као што је статеТак() имплементирана за свако стање и позовите ову методу из друге методецалтак() као:
 



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


У претходном коду, адреса статеТак() се прослеђује цаллТак(). Метода цалцулатеТак() ће користити ту адресу да позове метод статеТак() одређене државе и израчунава се државни порез „ст“. 
Пошто се код методе статеТак() мења из једног стања у друго стање, боље је да га декларишете као апстрактну методу у интерфејсу као: 
 

interface STax { double stateTax(); }


Следеће је имплементација статеТак() за државу Пенџаб: 
 

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


Следеће је имплементација статеТак() за ХП стање: 
 

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


Сада се метода израчунаТак() може дизајнирати као: 
 

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

Овде посматрајте параметар 'СТак т' у методи ЦалцулатеТак(). 'т' је референца на интерфејс 'СТак' који се прослеђује као параметар методу. Користећи ову референцу, метода статеТак() се зове као: 
 

double st = t.stateTax();


Овде ако се 'т' односи на метод статеТак() класе Пуњаб онда се тај метод позива и израчунава се његов порез. Слично за класу ХП. На овај начин прослеђивањем референце интерфејса методи ЦалцулатеТак() могуће је позвати метод статеТак() било ког стања. Ово се зове механизам повратног позива.
Преношењем референце интерфејса која се односи на метод могуће је позвати и користити тај метод из другог метода.
 

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

Излаз: 
 

Enter the state name Punjab Total tax = 5000.0


Референце: 
Како имплементирати функције повратног позива у Јави?  
Основна Јава: интегрисани приступ

Креирај квиз