繁体   English   中英

创建模块Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM