gpt4 book ai didi

java - 创建模块 Java

转载 作者:行者123 更新时间:2023-12-01 12:09:22 25 4
gpt4 key购买 nike

我有一个基于 PircBotX 框架运行的 Java 机器人。 IRC 机器人只是回复命令。所以现在我有一个静态字符串列表,例如; !weather!lastseen 等位于我的 Main.java 文件中。

对于我添加的每个命令,我都会创建一个新的静态字符串,并比较每个传入消息(如果它以任何定义的命令开头)。

伪代码

Receive message `m`
if m matches !x
-> do handleX()
if m matches !y
-> do handleY()

这基本上是一个非常大的 if 测试。

我想做的是创建某种骨架类,它可能实现一个接口(interface)并定义它应该执行的命令以及定义它应该执行的代码的主体。我的想法如下所示:

public class XkcdHandler implements CommandHandlerInterface
{
public String getCommand()
{
return "!xkcd";
}

public void HandleCommand(String[] args, Channel ircChannel)
{
// Get XKCD..
ircChannel.send("The XKCD for today is ..");
}
}

有了这样的类,我可以简单地添加一个新类并完成它。现在我必须添加命令,在列表中添加 if 测试,并将方法添加到 Main.java 类中。这并不是软件架构的一个很好的例子。

有没有一种方法可以让我创建自动加载这些类(或这些类的实例)的东西,然后只调用像 invokeMatchingCommand() 这样的东西?然后,此代码可以迭代加载的命令列表并在匹配实例上调用 HandleCommand

更新考虑到 BalckEye 的答案,我想我可以加载包中找到的所有类(即 Modules),实例化它们并将它们存储在列表中。这样我就可以按照他的答案中所示的方式处理每条消息(即迭代列表并为每个匹配的命令执行类方法)。

但是,根据 this thread 看来,这并不是真正可行的。此时我正在研究类加载器,也许这将是一个可行的解决方案。

最佳答案

我认为有几种方法。您可以只使用一个 Map,其中命令作为键,执行代码的接口(interface)作为值。像这样的事情:

Map<String, CommandInterface> commands = new ....

然后像这样使用 map :

CommandInterface cmd = commands.get(command);
if(cmd != null) {
cmd.execute();
}

关于java - 创建模块 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27348606/

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