【发布时间】:2015-02-05 13:18:18
【问题描述】:
我有一个基于 PircBotX 框架运行的 Java 机器人。 IRC 机器人只是简单地回复命令。所以现在我有一个静态字符串列表,例如; !weather、!lastseen 等在我的Main.java 文件中。
对于我添加的每个命令,我都会创建一个新的静态字符串,并比较每个传入消息是否以任何定义的命令开头。
伪代码
Receive message `m`
if m matches !x
-> do handleX()
if m matches !y
-> do handleY()
这基本上是一个非常大的 if 测试。
我想做的是创建某种骨架类,它可能实现一个接口并定义它应该对哪个命令执行操作,以及一个定义它应该执行的代码的主体。我在想的东西如下所示:
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 的说法,这似乎并不可行。在这一点上,我正在研究类加载器,也许这将是一个可行的解决方案。
【问题讨论】:
-
老实说,我知道您想动态地执行此操作,但这样做很麻烦。当您使用user4335475的方法时,它会简单明了。另外,它更像是 API 风格:P
标签: java