Есть ли способ передать ссылку на метод в Java? - PullRequest
2 голосов
/ 18 февраля 2012

Это довольно сложно сформулировать, но мне нужно иметь возможность связать определенный метод с объектом.Более конкретно, я делаю графический ориентированный графический интерфейс, и я хочу иметь возможность назначить произвольный метод в качестве функции «по умолчанию» для элемента, такого как кнопка.

То есть ясоздали эти сопряженные «графические» объекты, которые в основном имеют возможность рисовать сами.Я хотел бы, чтобы они выполняли свои собственные действия, поэтому я могу, например, сделать что-то вроде этого:

GraphicObject b1 = new Button();
GraphicObject b2 = new Button();
b1.assignDefaultAction(---some method reference here--);
b2.assignDefaultAction(---a different method reference here--);

Затем, если я сделаю что-то вроде:

b1.action();
b2.action();

Каждый элементбудет вызывать свой собственный ссылочный метод независимо.Я считаю, что это возможно сделать в C ++, но я не видел этого в Java.Это вообще возможно, или есть какой-то обходной путь?Я стараюсь избегать создания конкретной абстракции для каждой мелочи, которую мне нужно сделать, или засорять мою содержащуюся JPanel сотнями спецификаций, которые выглядят просто беспорядочно.

Спасибо за вашу помощь.

Ответы [ 4 ]

6 голосов
/ 18 февраля 2012

Кнопки должны использовать ActionListener реализации.Придерживайтесь Swing в этом конкретном случае.

Ваши собственные классы могут последовать их примеру и начать с интерфейса шаблонов команд:

public interface Command {
    public void execute(Map<String, Object> parameters); 
}

Или, возможно, лучшей идеей будет придерживаться API,JDK предоставляет и пробует Callable .

1 голос
/ 18 февраля 2012

В Java нет ссылок на методы.Вместо этого вы можете использовать псевдо-замыкания (анонимные внутренние классы).Единственная проблема с этим, конечно, вы не можете использовать функции при необходимости.

0 голосов
/ 01 декабря 2013

Начиная с Java 8 будут простые в использовании ссылки на методы и лямбда-выражения.

Назначение действий кнопкам на самом деле является ярким примером.

 bttnExit.setOnAction((actionEvent) -> { Platform.exit(); });

или, используя ссылки на метод:

 bttnExit.setOnAction(MyClass::handleExitButton);
0 голосов
/ 03 марта 2012

Обычно вы просто используете анонимный внутренний класс ActionListener для этого и добавляете любые вызовы методов, которые хотите, в метод actionPerformed.

Что-то вроде:

b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent a) {
        b.someMethod();
    }               
});
...