【问题标题】:Having a Java class where one of the fields is a method?拥有一个其中一个字段是方法的 Java 类?
【发布时间】:2011-08-10 22:33:01
【问题描述】:

我对 Java 还是很陌生,因为我的帖子的性质会泄露

我需要创建一个包含一组方法的类,如果需要,程序员可以轻松扩展这些方法。我想过开设两个课程:CommandsCommandCommands 包含一个 Command 对象数组,程序员可以在其中添加新命令。 Command 类有两个字段。类的名称和方法签名。我不确定如何做到这一点。在C语言中,我认为你可以有一个函数结构,那么我们可以有一个类的实例是方法的类吗?还是我完全走错了路?

我想过尝试做这样的事情:

public class Commands
{
    private ArrayList<Command> commands;

    /**
     * Constructor for objects of class Command
     */
    public Commands()
    {
        createCommands();
    }

    /**
     * This is where a programmer can add new commands
     */
    public void createCommands()
    {
        commands.add(new Command("move", public void move()));
    }

    /**
     * This is where the programmer can define the move command
     */
    public void move()
    {
        ....
    }
}

public class Command
{
    private String command_name;
    private Method command;

    public Command(String command_name, Method command)
    {
        this.command_name = command_name;
        this.command = command;
    }
}

我知道这有很多问题,但我一直在寻找正确的方法。提示/帮助会很棒。

【问题讨论】:

  • 你想通过这个实现的总体目标是什么?
  • 会有很多命令,用户可以通过输入“execute name_of_command”来执行。命令将在 Commands 类中定义

标签: java class object methods field


【解决方案1】:

我想你想使用Command pattern

在面向对象编程中, 命令模式是一种设计模式 一个对象用来表示哪个 并封装所有信息 需要稍后调用方法 时间

维基百科页面有一个例子。

您的Command 应该是一个带有execute 方法的接口。程序员可以编写一个实现Command 接口的类,因此她/他必须实现execute 方法才能完成所需的工作。然后您可以拥有一个Command[] 数组,并且对于每个Command 对象,您只需调用execute 来执行任务。

【讨论】:

  • 非常感谢。这是一个很大的帮助,我认为它奏效了。现在唯一的事情是我需要能够命名命令,以便用户可以通过键入“execute name_of_command”来执行它们。我正在尝试使用 HashMap 来存储名称和命令。我看看怎么走
  • 不客气!使用Map 将用户友好的命令名称与相应的Command 对象相关联是个好主意。
【解决方案2】:

Java 没有函数指针。这是一个常见的技巧:

abstract class (or interface) Command {
  void execute();
}

public void createCommands() {
  commands.add(new Command(){ 
      @Override
      void execute() {
        something.move();
      }
    });
}

【讨论】:

    【解决方案3】:

    Java 没有函数指针,所以这不起作用。您可能想要做的是拥有一个带有 execute() 方法的 Command 接口,您可以在具体子类中实现该方法。

    这是风格问题,但我通常不会在命令实现中使用名称字段。相反,我会创建一个 Map&lt;String, Command&gt; 来保存每个命令的名称。

    【讨论】:

    • 编辑:我在使用您建议的地图时遇到了问题,但我想我现在可以正常工作了。谢谢!
    【解决方案4】:

    请注意,您不能在 Java 中直接传递方法。相反,它们需要是实现公共接口的对象。例如,您的方法可能成为实现 Runnable 接口的对象。然后在需要使用该方法的时候调用“run”即可。

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 2013-08-25
      • 2015-06-15
      • 2018-01-21
      • 2012-05-06
      • 2010-10-10
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多