Retorno de chamada em C/C++: O mecanismo de chamar uma função de outra função é chamado de retorno de chamada. O endereço de memória de uma função é representado como ‘ponteiro de função’ em linguagens como C e C++. Portanto, o retorno de chamada é obtido passando o ponteiro de function1() para function2().
Retorno de chamada em Java: Mas o conceito de função de retorno de chamada não existe em Java porque Java não possui conceito de ponteiro. No entanto, existem situações em que se pode falar de um objeto de retorno de chamada ou de uma interface de retorno de chamada. Em vez de passar o endereço de memória de uma função é passada uma interface que se refere à localização de uma função.
Exemplo
Vejamos um exemplo para entender onde os retornos de chamada podem ser usados. Suponha que um programador queira projetar uma calculadora de impostos que calcule o imposto total de um estado. Suponha que existam apenas dois impostos: o imposto central e o imposto estadual. O imposto central é comum, enquanto o imposto estadual varia de um estado para outro. O imposto total é a soma dos dois. Aqui, um método separado como stateTax() é implementado para cada estado e chama esse método de outro método calculaTax() como:
static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }
No código anterior, o endereço de stateTax() é passado para calcularTax(). O método calculaTax() usará esse endereço para chamar o método stateTax() de um determinado estado e o imposto estadual ‘st’ é calculado.
Como o código do método stateTax() muda de um estado para outro, é melhor declará-lo como um método abstrato em uma interface como:
interface STax { double stateTax(); }
A seguir está a implementação de stateTax() para o estado de Punjab:
class Punjab implements STax{ public double stateTax(){ return 3000.0; } }
A seguir está a implementação de stateTax() para o estado HP:
class HP implements STax { public double stateTax() { return 1000.0; } }
Agora, o método calculaTax() pode ser projetado como:
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); } Observe aqui o parâmetro ‘STax t’ no método calculaTax(). 't' é uma referência da interface 'STax' que é passada como parâmetro para o método. Usando esta referência, o método stateTax() é chamado como:
double st = t.stateTax();
Aqui, se ‘t’ se refere ao método stateTax() da classe Punjab, então esse método é chamado e seu imposto é calculado. Da mesma forma para a classe HP. Desta forma, passando a referência da interface para o método calculaTax() é possível chamar o método stateTax() de qualquer estado. Isso é chamado mecanismo de retorno de chamada.
Ao passar a referência da interface que se refere a um método é possível chamar e utilizar esse método a partir de outro método.
// 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); } }
Saída:
Enter the state name Punjab Total tax = 5000.0
Referências:
Como implementar funções de retorno de chamada em Java?
Core Java: uma abordagem integrada