スポンサーリンク
スポンサーリンク

Javaにおける関数ポインタのやり方

見習い

すいません、そもそも関数ポインタってなんですか?

管理人

簡単に説明すると、A関数の引数にB関数のポインタを指定して、A関数内でB関数を呼び出す、この流れが関数ポインタだよ。

見習い

つまり、関数の引数に関数を渡そう!ってことですか?

管理人

その通り!

Cで使われる関数ポインタは、Javaでも同じようなことができます。

Java自体に関数ポインタというのは存在しませんが、これから紹介するやり方で実現することができます。

そのためには、JavaのInterfaceという機能を使います。

なので今回はそのInterfaceを用いた関数ポインタのやり方を紹介します。

Interfaceを定義する

それではまず、Interfaceを定義しましょう。

今回はMain.javaというファイル名でプログラムをします。

(Main.java)

Interfaceを定義するには、interfaceというキーワードを使います。

中にfunc関数を定義していますが、このfunc関数はInterface内では定義しません。

なので今は、Interfaceの中にfunc関数があるだけの状態です。

main関数を定義する

そしたらmain関数を定義しましょう。

(Main.java)

見習い

これは雛形プログラムだね。

関数ポインタを使う関数を定義する

それではいよいよ、関数ポインタを使っていきます。(正確には関数ポインタを使うとは言いませんが)

Mainクラス内に以下のshow関数を定義します。

(Main.java)

このshow関数の引数はInterfaceとなっています。
C言語だと関数ポインタをする際は「void *(show)()」といった感じで行うのですが、Javaの場合はInterfaceを渡します。

見習い

このshow関数の引数に直接関数を渡すわけではないのね。

管理人

そうなんです。Javaではポインタがないので、直接関数を渡すのではなく、インターフェースを介して関数を渡すことになります。

実際に、関数を引数に入れてみる

そしたら実際に、関数を引数に渡してみます。

(Main.java)

少し複雑になったので、分けて解説していきます。

まず、show関数を呼び出さないといけないので、show関数を呼び出します。

そしたら、show関数の引数はInterfaceなので、Interfaceを引数にいれます。

普通だったこうしたいところですが、これではエラーになってしまいます。
そのため、Interfaceを引数に入れる際は、

(Main.java)

このように、普通のクラスのように定義をします。
これをそのままshow関数の引数としていれます。
そして、このfunc関数ですが、必ず定義してください。
定義しなかったらエラーになってしまいます。

では、できあがったプログラムがこちらです。

(Main.java)

これで、

と表示されれば成功です。

見習い

少しプログラムが長い気がします。

管理人

そうですね。実際、長い処理を渡したい時にこの書き方はしたくないですね。

管理人

そこで次の応用に移りましょう。

応用

これでJavaでの関数ポインタのやり方はわかりましたが、func関数の中身が非常に長い場合にどうしたらいいか、というのを紹介します。
やり方は簡単です。

(Main.java)

こういったように、func関数に書かないといけない長い処理を、別の関数を用意して、そこに記述するというやり方です。
関数が多くなってしまいますが、長い処理を書く場合はこのやり方がおすすめです。

見習い

関数が増えるけど、この書き方がベストな気がする。

管理人

そうですね。こういったところでポインタの便利さを思い知りますよね。

管理人

それでは、ここまでお疲れ様でした。

 

コメント