Ну, я видел, что были некоторые вопросы и ответы об этом, но они меня действительно не удовлетворяли.Отражения плохой или хорошей практики для команд
Скажем, например, я запрограммировал консоль. Это хороший JFrame с выходом и входным txtField/Area. Но эта консоль должна использоваться не только для вывода, но и для запуска команд.
Потому что я должен был бы эту консоль очень часто, и я не хочу, чтобы изменить код консоли я запрограммировал это так:
Консоль имеет один метод для регистрации команд.
console.registerCommand(String command, String methodToInvoke, Object invokeObject);
С помощью этого метода я могу использовать эту консоль везде, не нуждаясь в изменении или вдыхании.
Всякий раз, когда записывается String command
, консоль знает, что это зарегистрированное ключевое слово и выполняет метод с помощью отражения.
Будет ли это хорошей или плохой практикой? По стилю кода и производительности! И что я мог сделать лучше?
Я также нашел довольно аккуратным использование отражений таким образом, чтобы добавить ActionListeners в MenuItems в TrayIcon.
Редактировать
К ниже Ответ:
Ok с командами я бы принять это способ сделать. Но в примере с лотком я написал класс TrayHelper, который создает TrayIcon. Там я хочу добавить MenuItems и их ActionListeners, но без создания каждого объекта сам и добавить их в Лоток. Так что я написал такие методы, как это:
public void addMenuItem(String label, String methodToInvoke, String invokeObject);
Этот метод не только выполняет метод, когда MenuItem нажата, но и создает MenuItem первый, добавляет ActionListener к нему, который вызывает метод, и добавляет его в TrayIcon ,
Поэтому для того, чтобы использовать эту TrayHelper теперь я могу просто написать:
th.addMenuItem("Exit","exitMethod",this);//executes the exitMethod of
//this class after Menuitem Exit
//was clicked
Я не очень понимаю, как я мог бы сделать это без отражения другого, чем писать все объекты себя снова и добавлять их в поднос. Или я слепой :)
Edit 2
Хорошо, я был слеп. Я просто не понимал, как это сделать без отражения, но это так просто.
Особенно с шаблоном команды.
Из анонимных классов я мог бы сделать это таким образом, и мне очень нравится, как писать код таким образом (я всегда делал это с ActionListeners)
th.addMenuItem("Test",new Command(){
public void execute(){
//do stuff
}
});
Спасибо :)
У вас есть особая проблема? В противном случае это скорее дискуссия, чем вопрос. Вы в основном придумали архитектуру плагина бедного человека; Я не вижу ничего плохого в этом. –
Я использовал консоль и чувствовал, что это снизит мою производительность. Не только производительность программы, но и компьютера. Эсперантически после выполнения программы чаще (из-за развития, но всегда в одно время) – Loki
Беспокоитесь о производительности, если и когда это действительно становится проблемой. Если вы неоднократно выполняете свои зарегистрированные команды тысячи раз в цикле извне, я не вижу, как производительность будет проблемой. Поэтому просто убедитесь, что все циклы запущены * внутри * invokeObject, и у вас никогда не должно быть проблем с производительностью. –