gpt4 book ai didi

java - 反射(reflection)命令的坏习惯或好习惯

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:28 27 4
gpt4 key购买 nike

嗯,我看到有一些关于这个的问题和答案,但他们并没有真正让我满意。

例如,我编写了一个控制台。这是一个不错的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com