在Java中使用接口的回调
C/C++中的回调:从一个函数调用另一个函数的机制称为“回调”。函数的内存地址在 C 和 C++ 等语言中表示为“函数指针”。因此,回调是通过将 function1() 的指针传递给 function2() 来实现的。
Java 中的回调: 但是 Java 中不存在回调函数的概念,因为 Java 没有没有指针概念。但是,在某些情况下,我们可以谈论回调对象或回调接口。不是传递函数的内存地址,而是传递指向函数位置的接口。
例子
让我们举个例子来理解在哪里可以使用回调。假设一个程序员想要设计一个税收计算器来计算一个州的总税收。假设只有两种税,中央税和州税。中央税很普遍,而州税因州而异。总税额为两者之和。这里为每个州实现了像 stateTax() 这样的单独方法,并从另一个方法 calculateTax() 调用此方法:
static void calculateTax(address of stateTax() function) { ct = 1000.0 st = calculate state tax depending on the address total tax = ct+st; }
在前面的代码中,stateTax() 的地址被传递给 calculateTax()。 calculateTax() 方法将使用该地址调用特定州的 stateTax() 方法,并计算州税“st”。
由于stateTax()方法的代码从一种状态变为另一种状态,所以最好在接口中将其声明为抽象方法,如:
interface STax { double stateTax(); }
以下是Punjab州的 stateTax() 实现:
class Punjab implements STax{ public double stateTax(){ return 3000.0; } }
以下是 HP 州的 stateTax() 的实现:
class HP implements STax { public double stateTax() { return 1000.0; } }
现在,calculateTax() 方法可以设计为:
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); }
在这里,观察 calculateTax() 方法中的参数“STax t”。 “t”是作为参数传递给方法的“STax”接口的引用。使用此引用调用 stateTax() 方法,如下所示:
double st = t.stateTax();
此处,如果“t”引用 Punjab 类的 stateTax() 方法,则调用该方法并计算其税金。对于类 HP 也一样。这样通过将接口引用传递给 calculateTax() 方法,就可以调用任何州的 stateTax() 方法。这称为回调机制。
通过传递引用一个方法的接口,可以从另一个方法调用和使用该方法。
完整代码
// 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
参考资料:
如何在 Java 中实现回调函数?