PHPやJavaScriptのように、Javaの変数に関数を割り当てる方法はありますか?
...または、Javaに関しては、この領域は別の方法で機能しますか?
PHPやJavaScriptのように、Javaの変数に関数を割り当てる方法はありますか?
...または、Javaに関しては、この領域は別の方法で機能しますか?
JavaにはMethod
、MethodHandles
リフレクションを介してメソッドを呼び出すことができるが、その言語ではまだサポートされていません。
Java 8では、メソッドへの参照を使用できるようになります。
今日のJavaでは、できません。
最も近いのはインターフェースです。関数は保存しませんが、必要な関数を定義するインターフェースの実装です。
典型的な例は、Comparatorインターフェースの実装です。
Comparator<ProductSearchResult> c = new Comparator<ProductSearchResult>() {
public int compare(ProductSearchResult result1, ProductSearchResult result2) {
return result1.product.getRsId().compareTo(result2.product.getRsId());
}
};
Collections.sort(groupResults, c); // I pass a function, wrapped in my Comparator implementation
最も近いのは、インターフェースと組み合わされた内部クラスです。これらは、必要に応じてマスタークラスのメソッドに委任できる1つだけでなく、多くの関数(メソッド)を実行できます。しかし、このソリューションは簡単に重すぎる可能性があります。
class Main {
interface X {
void doX();
}
class Ref1 implements X {
void doX() { doA(); };
}
class Ref2 implements X {
void doX() { doB(); };
}
void doA() { };
void doB() { };
void demo() {
X x = new Ref1();
x.doX();
}
}
これはLambdasに似たものをシミュレートします...(文字列以外のものを使用する場合はもう少しキャストが必要になりますが、例は簡潔にしておきます)...
public class MyTest {
public static void main(String[] args) {
Lambda l = new Lambda() { public Object func(Object x)
{ return "Hello " + x; }
};
System.out.println(l.func("Bob"));
System.out.println(nowTryFromMethod(l));
System.out.println((new Lambda() { public Object func(Object x)
{ return "Goodbye " + x; }
}).func("Harry"));
}
private static Object nowTryFromMethod(Lambda l) {
return l.func("Jerry");
}
}
class Lambda {
public Object func(Object x) { return null; }
}
出力:
Hello Bob
Hello Jerry
Goodbye Harry
アップデート
Javaは、バージョン1.8からLambdaと呼ばれる関数への参照をサポートしています