📜  使用Java中的接口进行回调

📅  最后修改于: 2022-05-13 01:54:27.216000             🧑  作者: Mango

使用Java中的接口进行回调

C/C++ 中的回调:从另一个函数调用一个函数的机制称为“回调”。函数的内存地址在 C 和 C++ 等语言中表示为“函数指针”。因此,回调是通过将 function1() 的指针传递给 function2() 来实现的。
Java中的回调:JavaJava不存在回调函数的概念,因为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();
}

以下是旁遮普邦 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”指的是旁遮普类的 stateTax() 方法,则调用该方法并计算其税金。同样,对于 HP 类。这样,通过将接口引用传递给 calculateTax() 方法,就可以调用任何状态的 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 Pardesh 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中实现回调函数?
核心Java: 一种集成方法