В моем текущем приложении есть JFrame с примерно 15 действиями, хранящимися в виде полей внутри JFrame. Каждое из действий - это анонимный класс, и некоторые из них довольно длинные.
Распространено ли разбивать действия на их собственные классы, возможно, внутри подпакета, называемого действиями?
Если нет, то как обычно преодолевается эта сложность?
Спасибо




Обычно я это делаю. Каждое действие получает свой собственный класс, который имеет ссылку на объект «приложение», чтобы оно могло получить доступ к нужным ему ресурсам. Обычно у меня есть диспетчер действий, который содержит все действия, поэтому есть одно место для доступа к ним, а также одно место для обновления их возможностей и прочего.
В конце концов, это также становится неуправляемым, и тогда вы должны начать думать об использовании инфраструктуры приложений, такой как Eclipse RCP, NetBeans framework, JIDE и т. д. Это особенно верно, если вы хотите поддерживать определяемые пользователем раскладки клавиатуры и тому подобное.
Если возможно, что ваши действия могут быть повторно использованы (например, с помощью сочетаний клавиш, других меню, других диалогов и т. д.), И особенно если они могут работать непосредственно с базовой моделью (а не с пользовательским интерфейсом), тогда это обычно лучше не иметь их как анонимные классы.
Скорее создайте отдельный пакет и создайте классы для каждого.
Часто также имеет смысл не создавать их напрямую, а иметь своего рода менеджера, который определяет константы, инициализирует и возвращает наборы действий, чтобы вы могли, например, предлагать разные наборы действий в разных версиях или устанавливать только определенные действия. для внутренних релизов.
Наконец, проверьте, можно ли преобразовать ваши действия в иерархию классов. Часто они могут, что экономит репликацию кода, а также помогает повысить надежность (например, проверять наличие определенных условий, прежде чем разрешить выполнение действия).
Что я делаю, так это создаю пакет (фактически дерево пакетов) для классов действий, а затем создаю экземпляр каждого класса в соответствии с контекстом. Почти все мои классы действий абстрактны с абстрактными методами для получения контекста (как Spring).
public abstract class CalcAndShowAction extends AbstractAction {
//initialization code - setup icons, label, key shortcuts but not context.
public void actionPerformed(ActionEvent e) {
//abstract method since it needs ui context
String data = getDataToCalc();
//the actual action - implemented in this class,
// along with any user interaction inherent to this action
String result = calc(data);
//abstract method since it needs ui context
putResultInUI(result);
}
//abstract methods, static helpers, etc...
}
//actual usage
//...
button.setAction(new CalcAndShowAction() {
String getDataToCalc() {
return textField.getText();
}
void putResultInUI(String result) {
textField.setText(result);
}
});
//...
(извините за ошибки, я написал это вручную в этом текстовом поле, а не в IDE).
Я думаю, что, возможно, в качестве альтернативы или в дополнение к ActionManager, действия являются хорошими кандидатами для внедрения в представление, используя, например, Spring.