Java:基于用户输入的run方法?

时间:2012-02-28 20:47:28

标签: java

说我有三种方法

method1()
method2()
method3()

我让用户输入一个与他们想要运行的方法相对应的数字,有没有办法直接从他们的输入运行它?即不是按照

的方式使用if语句
System.out.println("Which method would you like to run? 1/2/3");
String input = reader.readLine();
if(input == 1){method1();}
if(input == 2){method2();}
...

等。而是能够有像

这样的东西
System.out.println("Which method would you like to run? 1/2/3");
String input = reader.readLine();
method(input)();

5 个答案:

答案 0 :(得分:8)

是的,您可以通过使用如下界面来实现:

interface A {
    void run();
}

public void method1() {}

public void method2() {}

public void mainMethod(String[] args) {
    // Initialise the method map - note, you only have to do this once
    // So, this initialisation code can go into a constructor
    // And mothodMap can be declared as a final instance variable.
    A methodOne = new A() { @Override public void run() { method1(); } };
    A methodTwo = new A() { @Override public void run() { method2(); } };

    Map<Integer, A> methodMap = new HashMap<>();
    methodMap.put(1, methodOne);
    methodMap.put(2, methodTwo);

    Integer input = /* get it from user*/ 1;
    A aMethod = methodMap.get(input);
    aMethod.run();

}

答案 1 :(得分:4)

不,除非您使用reflection。 Java没有函数指针,否则您可以索引到数组中的相应函数。但是if语句有什么问题?它们更具可读性和安全性。

如果您正在寻找面向未来的更抽象的解决方案,请考虑strategy pattern

// strategy
interface CommandMethod {
    void runMethod();
}

// for every method 1 .. n
class CmdMethod1() implements CommandMethod {
    void runMethod() {
        // concrete implementation
    }
}

// initialization ----------------

Map<String, CommandMethod> cmds = new HashMap<String, CommandMethod>();
cmds.put("1", new CmdMethod1());
// .. etc ..
cmds.put("n", new CmdMethodN());

// at the prompt:
System.out.println("Which method would you like to run? 1/2/3/.../n");
String input = reader.readLine();

cmds.get(input).runMethod(); // more like what you're going for ?

答案 2 :(得分:1)

实现此目标的标准方法是创建“仿函数”

public interface Functor
{
    public void execute();
}

public class Method1 implements Functor
{
    public void execute() { /* do something */ }
}

etc...


private Functor[] f = { new Method1(), new Method2(), new Method3() };

...

// Execute the method selected by i
f[i].execute();

另请查看Callable界面

答案 3 :(得分:0)

不是没有if或switch语句(或paislee指出的反射)。如果你想做method(input);之类的事情,你需要在另一种方法中使用if / switch语句:

    ....
    String input = reader.readLine();
    method(input);
}

private void method(int input) {
    if (input == 1) {method1();}
    if (input == 2) {method2();}
}

答案 4 :(得分:0)

没有办法做到这一点。但是,您可以使用if语句或switch-case语句来减轻“重定向”过程的麻烦。您还可以考虑创建一个包装函数来接受用户输入以使代码更清晰。