プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【Java】関数ポインタ的なもの

複数の関数を一つの配列にして任意の順番で実行するために関数ポインタ的なものが欲しくなりました。

C#だとDelegateでしたが、Javaだと関数型インターフェースがそれにあたるようです。
関数型インターフェースは抽象メソッドを1つだけ持つインターフェースで、任意の関数を渡してからその抽象メソッドを実行すると、渡した関数が実行されます。

関数型インターフェースは自分で定義してもいいのですが、引数の数や戻り値の種類ごとにデフォルトでいくつか用意されているので、通常はそれで事足りるでしょう。

今回はint型二次元配列arr1、arr2を2つ渡したかったので、BiConsumerを配列にして使います。
そこへ以下のようにSolverというクラスの4つの関数ShareCandidateLogic、PairLogic、CrossLogic、TripleLogicを突っ込みました。

Solver solver = new Solver();

BiConsumer<int[][],int[][]>[] logics = new BiConsumer[4];
logics[0] = solver::ShareCandidateLogic;
logics[1] = solver::PairLogic;
logics[2] = solver::CrossLogic;
logics[3] = solver::TripleLogic;

logics[3].accept(arr1, arr2);
logics[1].accept(arr1, arr2);
logics[0].accept(arr1, arr2);
logics[2].accept(arr1, arr2);

logics[2].accept(arr1, arr2);
logics[3].accept(arr1, arr2);
logics[0].accept(arr1, arr2);
logics[1].accept(arr1, arr2);


関数を参照するときにはクラス参照のピリオドを::に変えます。
BiConsumerではacceptメソッドが定義されているので、これを実行すると中身の関数に引数が渡された状態で実行されます。