- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
嗯,我看到有一些关于这个的问题和答案,但他们并没有真正让我满意。
例如,我编写了一个控制台。这是一个不错的 JFrame,带有输出和输入 txtField/Area。但是这个控制台不应该只用来输出,还应该用来运行命令。
因为我经常需要这个控制台,而且我不想更改控制台的代码,所以我这样编程:
控制台有一种注册命令的方法。
console.registerCommand(String command, String methodToInvoke, Object invokeObject);
通过这种方法,我可以在任何地方使用这个控制台,而无需更改或继承。
每当写入 String 命令
时,控制台就会知道它是一个已注册的关键字并通过反射执行该方法。
这是好事还是坏事?关于代码样式和性能!我可以做些什么更好?
我还发现以这种方式使用反射将 ActionListeners 添加到 TrayIcon 中的 MenuItems 非常巧妙。
编辑
下面的答案:
好的命令我会接受这是一种方式。但在 Tray 示例中,我编写了一个创建 TrayIcon 的 TrayHelper 类。在那里我想添加 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
除了自己再次编写所有对象并将它们添加到托盘外,我真的不知道如何在没有反射(reflection)的情况下做到这一点。或者我瞎了:)
编辑2
好吧,我瞎了。我只是没有意识到如何在没有反射(reflection)的情况下做到这一点,但它是如此简单。
尤其是命令模式。
因为匿名类,我可以那样做,而且我真的很喜欢这样写代码的方式(我总是用 ActionListeners 这样做)
th.addMenuItem("Test",new Command(){
public void execute(){
//do stuff
}
});
谢谢你:)
最佳答案
有更好的方法来做到这一点。这有助于隐藏在命令对象中完成的操作。由于您必须更改命令,因此不必弄乱其他代码。
此外,您可以有很多不同的命令,它们可以通过继承或聚合关联起来,或者根据需要相互注入(inject),而且其他人不必知道。
首先你有一个界面:
public interface Command {
void execute();
}
然后您的代码采用其中之一:
console.registerCommand(Command command);
然后你编写各种实现接口(interface)的类并做一些事情:
public class OneCommand implements Command {
public void execute() {
theObject.theMethod(theCommand); // calls what you would have with reflection
}
}
这是标准的 GOF 命令模式,您可以在这里阅读更多相关信息:LINK TO WIKIPEDIA
请注意,此模式与其他 GOF 模式一起于 1994 年出版在一本书中。作者在许多软件项目中收集了这些最佳实践。那本书是第 40 次打印(根据维基百科)。
所有这些都表明,多年来,许多人已经找到了很多理由在许多软件上使用这些,并在许多编程语言和系统中使用它们。
这并不意味着您需要始终使用它们,但使用久经考验的模式将有助于避免看不见的陷阱。
关于java - 反射(reflection)命令的坏习惯或好习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108930/
在我生活的世界中,构建一个将所有飞镖都扔到墙上的解决方案,并希望其中一些能命中靶心是一种非常糟糕的解决方案方法。 那么,我的问题出现了,什么时候在约定可接受的生产系统中使用 INSERT IGNORE
在数据处理时,经常会因为index报错而发愁。不要紧,本次来和大家聊聊pandas中处理索引的几种常用方法。 1.读取时指定索引列 很多情况下,我们的数据源是 CSV 文件。假设
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我是一名优秀的程序员,十分优秀!