Java には、第一級の関数としてのメソッドがありません。つまり、この言語は、他の言語のように渡すことができるメソッドへの参照を提供しません。質問で概説されているような構造の最善の策は、リフレクションを使用することです。
import java.lang.NoSuchMethodException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Set;
public class MyButton {
private Object onClickObject;
private Method onClickMethod;
public void OnClick(Object object, String methodName) throws NoSuchMethodException {
OnClick(object, object.getClass().getMethod(methodName));
}
public void OnClick(Object object, Method method) {
this.onClickObject = object;
this.onClickMethod = method;
}
// MyButton calls this method every time the button is clicked, in
// order to inform the external event handler about it
protected void onClick() throws IllegalAccessException, InvocationTargetException {
onClickMethod.invoke(onClickObject);
}
}
ただし、メソッドは第一級市民ではないため、上記は Java でイベント リスナーを実装する標準的な方法ではないことにも注意してください。代わりに、おそらく次のように、コールバック メソッドを使用してインターフェイスを定義するのが Java 流です。
public interface ButtonListener {
public void OnClick();
}
(これは、イベント ハンドラーにパラメーターを渡す必要がないことを前提としています。通常、これは想定できないため、 に加えて、パラメーターをカプセル化し、メソッドに渡される もありますButtonListener
。ButtonEvent
) インターフェイスで定義されています。)
次に、特定のボタンがクリックされるたびにイベントを受け取ることに関心があるクラスを作成する場合、そのクラスは を実装する必要がありますButtonListener
。次に、MyButton
クラスはリスナーを登録するメソッドを提供する必要があります。
public MyButton {
protected List<ButtonListener> buttonListeners;
public void addButtonListener(ButtonListener listener) {
...
}
public void removeButtonListener(ButtonListener listener) {
...
}
protected void fireButtonEvent() {
...
}
}
java.awt
Java 標準クラス ライブラリ、特にandでそのパターンをかなり見たことがあると思います。javax.swing
たとえばjava.awt.event.ActionListener
、AWT がボタン イベントに使用する と を参照してください。