В 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 совсем немного, особенно в java.awt
и javax.swing
- см., например, java.awt.event.ActionListener
, что и использует AWT для событий кнопок.