说我有三种方法
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)();
答案 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语句来减轻“重定向”过程的麻烦。您还可以考虑创建一个包装函数来接受用户输入以使代码更清晰。