【问题标题】:Create modules Java创建模块 Java
【发布时间】: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


【解决方案1】:

您正在寻找静态块,例如:

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
}

【讨论】:

    【解决方案2】:

    我认为有几种方法。您可以只使用带有命令的 Map 作为键和执行代码的接口作为值。像这样的:

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

    然后像这样使用地图:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多