【问题标题】:Using Function Pointer in Java for a Simple Command Line Interpreter在 Java 中使用函数指针作为简单的命令行解释器
【发布时间】:2014-10-29 10:44:36
【问题描述】:

我是 Java 新手,我正在尝试构建一个简单的 cli 来执行一些命令。在验证部分,我需要在 C 中创建类似函数指针的东西,但在 Java 中使用接口似乎无法正确处理。

class Com{
    int argsCount;
    //pointer to function
    public Com (int argCount)
    {
        this.argsCount=argCount;
    }
}

Map <String,Com> verMap= new HashMap<String,Com>(); 

verMap.put("clear", *here*);

interface clearConsoleFunction {
    public String clearConsole();
}

clearConsoleFunction 函数的主体应该这样做:

    Runtime.getRuntime().exec("cls");

我只需要在地图的 here 部分调用 clearConsole,这就是我尝试使用接口的原因,因为我不知道还能怎么做,但我可以'好像没弄好。

【问题讨论】:

  • clearConsoleFunction 是一个接口。为什么要放到Map
  • 我没有。我正在尝试通过使用接口在 Java 中使用函数指针。但我不知道如何从那里给他们打电话。我需要一个指向地图中 clearConsole 的指针。
  • 您正在执行一个命令,但 java 不知道在哪里执行该命令。正如我看到的一些与此相关的问题,我发现每次在命令提示符的新实例上触发新命令时,您可能需要一些直接与命令提示符交互的包装类或 dll。

标签: java function pointers interface command-line-interface


【解决方案1】:

如果您想使用接口作为函数指针替换,您必须实现单个接口而不是每个命令的接口。

如果您不想为每个命令创建一个类,您可以使用匿名类

package com.me;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String [] args) {
        Map<String, CommandRunner> verMap = new HashMap<String, CommandRunner>();

        // Add all the commands :
        verMap.put("clear", new CommandRunner() {
            @Override
            public String run() {
                try {
                    Runtime.getRuntime().exec("cls");
                } catch (IOException e) {
                    throw new RuntimeException(e);
                } 
                return "";
            }
        });

        // Run it
        verMap.get("clear").run();
    }
}

还有 CommandRunner 界面:

package com.me;

public interface CommandRunner {
    String run();
}

【讨论】:

  • @dili:抱歉缺少括号,已修复。
  • CommandRunner 无法解析为类型。并在接口中出现此错误:“成员接口 CommandRunner 只能在顶级类或接口中定义”
  • 创建一个包含接口声明的文件CommandRunner.java。
猜你喜欢
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 2014-10-01
  • 2011-03-01
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多