C/C++ でのコールバック: 別の関数から関数を呼び出す仕組みをコールバックといいます。関数のメモリアドレスは、C や C++ などの言語では「関数ポインター」として表されます。したがって、コールバックは function1() のポインタを function2() に渡すことによって実現されます。
Java でのコールバック: ただし、Java にはポインターの概念がないため、Java にはコールバック関数の概念が存在しません。ただし、コールバック オブジェクトまたはコールバック インターフェイスについて話すことができる状況もあります。関数のメモリアドレスを渡す代わりに 関数の場所を参照するインターフェイスが渡されます。
例
Java例外処理
コールバックがどこで使用できるかを理解するために例を見てみましょう。プログラマーが、州の合計税を計算する税計算機を設計したいとします。税金は中央税と州税の 2 つだけであると仮定します。中央税は共通ですが、州税は州ごとに異なります。合計税額は両者を合計したものとなります。ここでは、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() メソッドのコードはある状態から別の状態に変化するため、次のようにインターフェイスで抽象メソッドとして宣言することをお勧めします。
TCPとUDPの比較
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() メソッドは次のように呼び出されます。
Javaはintを文字列に変換します
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でコールバック関数を実装するにはどうすればよいですか?
コア Java: 統合されたアプローチ