
[英]Java Modules: Have access to a access to an object but unable to create the object
[英]Create modules Java
我有一个基于PircBotX框架运行的Java机器人。 IRC机器人仅响应命令。 所以现在我有一个静态字符串列表,例如; 我的Main.java
文件中的!weather
, !lastseen
之类的内容。
对于每个命令,我添加一个新的静态字符串,并比较每个传入消息是否以任何已定义的命令开头。
伪代码
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 test,并将该方法添加到Main.java类中。 这不是一个很好的软件体系结构示例。
有没有一种方法可以创建可以自动加载这些类(或这些类的实例)的东西,然后仅调用诸如invokeMatchingCommand()
? 然后,此代码可以迭代已加载命令的列表,并在匹配的实例上调用HandleCommand
。
更新考虑到BalckEye的答案,我认为我可以加载包中找到的所有类(即Modules
),实例化它们并将它们存储在列表中。 这样,我可以按照他的回答所示处理每个消息(即,对列表进行迭代并为每个匹配的命令执行class方法)。
但是,根据该线程看来,这样做确实不可行。 在这一点上,我正在研究类加载器,也许这将是一个可行的解决方案。
我有几种想法。 您可以只使用带有命令作为键的Map和执行代码的接口作为值。 像这样:
Map<String, CommandInterface> commands = new ....
然后像这样使用地图:
CommandInterface cmd = commands.get(command);
if(cmd != null) {
cmd.execute();
}
您正在寻找静态块,例如:
class main {
private static List<CommandHandlerInterface> modules = new ArrayList<...>();
static { // gets called when a static member gets accessed for the first time (once per class)
modules.add(new WeatherCommand());
// etc.
}
// method here which iterates over modules and checks
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.