Javaで関数ポインターを使用する方法️ ✨


導入


ポインタはメモリアドレスを格納するオブジェクトであり、値を渡す代わりに直接対象のオブジェクト、配列、または変数のアドレスを指すことでメモリを節約できます.悲しいJavaはポインタの「本当の」コンセプトを持っていない.我々にとって幸運なことに、本物に近いメソッドリファレンスを使用する回避策があります.

関数ポインタ


関数ポインタは関数のアドレスを指すポインタである.いくつかの使用法は、その実行に基づいて別の関数を呼び出すか、動的に呼び出すメソッドのための関数ポインタの配列を格納する関数を作成することでコールバックルーチンを作成します.

関数ポインタのシミュレーション


4 , 256 , 7152 , 152の4種類があり、特定のオブジェクトのインスタンスメソッドを参照する種類を使用しています.
あなたが指しているメソッドのメソッドシグネチャを定義するインターフェイスを定義することから始めましょう.
// Wrapping interface
private interface FunctionPointer {
  // Method signatures of pointed method
  void methodSignature(int a);
}
次に、メソッドメソッドシグネチャを使用してメソッドを作成します.
public void method1(int b) {
  System.out.println("Called method1 with integer " + b);
}

public void method2(int v) {
  System.out.println("Called method2 with integer " + v);
}

public void method3(int a) {
  System.out.println("Called method3 with integer " + a);
}
次のステップはラップインタフェースの変数を作成し、メソッドを割り当てます.変数は、格納または実行される関数ポインタとして機能します.
// Create a variable of the interface and assign
// the method references
FunctionPointer pointer1 = this::method1;
FunctionPointer pointer2 = this::method2;

// Call both methods using their "pointer"
pointer1.methodSignature(3);
pointer2.methodSignature(2);

// Reassign and call pointer 1
pointer1 = this::method3;

pointer1.methodSignature(5);
Called method1 with integer 3

Called method2 with integer 2

Called method3 with integer 5

メソッド参照 を使う


ラムダを使用してメソッド参照を割り当てることができます.
// Create a method reference and assign a methods using a lambda.
FunctionPointer pointer1 =
  (a) -> System.out.println("Called pointer1 with int " + a);

FunctionPointer pointer2 =
  (b) -> System.out.println("Called pointer2 with int " + b);

関数ポインタの配列


メソッド参照の配列の機能は、ラッピングインターフェイスの配列を作成することによってエミュレートできます.
// Create an array of "pointers"
FunctionPointer[] functionPointersArray = new FunctionPointer[3];

// Assign methods
functionPointersArray[0] = this::method1;
functionPointersArray[1] = this::method2;
functionPointersArray[2] = this::method3;

// Call methods    
functionPointersArray[0].methodSignature(3);
functionPointersArray[1].methodSignature(4);
functionPointersArray[2].methodSignature(5);

関数ポインタ対ダイレクトコール


あなたは、メソッドを直接呼び出すメソッドリファレンスを使用するためのペナルティはありますか?答えははい、しかし小さいものです.

上記のチャートから、直接メソッド呼び出しは、格納されたメソッドよりラムダを呼び出すための余分なステップのため、メソッドリファレンスを使用するよりもほぼ5倍速いです.正直に言うと、おそらくパフォーマンスペナルティに気付かないので、心配しないでください.

結論


ポインターは直接値を渡すのではなく、オブジェクトのアドレスに直接指す変数です.関数ポインタはメモリ消費を減らすことができる関数のアドレスを直接指す.Javaはポインタを持っていませんが、メソッドリファレンスやラムダを使用して動作をエミュレートできます.メソッドリファレンスを使用すると、直接メソッド呼び出しよりも遅くなりますが、機能の使用を抑制するのに十分ではありません.
これが役に立つならば、私の またはnewsletterにサインアップを考慮してください.読書ありがとう!