2012-02-28 3 views
2

говорят, у меня есть три методаJava: запустить метод на основе пользовательского ввода?

method1() 
method2() 
method3() 

и у меня есть данные, введенные пользователем номер, соответствующий какой метод они хотят работать, есть ли способ запустить непосредственно из их ввода? то есть вместо того, если заявление вдоль линий

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)(); 

?

+1

Посмотрите на этот ответ: http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name-as-a -string –

+0

A более широкий контекст был бы полезен, потому что существует несколько совершенно разных подходов, которые могут вам пригодиться. – dasblinkenlight

ответ

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 ? 
0

Не, не имея если или переключатель заявление (или отражения как указывал Пейсли). Если вы хотите сделать что-то вроде method(input); вы нужны, если/переключатель заявление в другом методе:

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

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

Там нет никакого способа сделать это. Однако вы можете использовать операторы if или операторов switch-case, чтобы сделать процесс перенаправления менее громоздким. Вы также можете подумать о создании функции обертки, чтобы принять ввод пользователя, чтобы сделать ваш код более чистым.

7

Да вы могли бы достичь, используя интерфейс следующим образом:

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

Стандартный способ достижения этой цели является создание «функтор»

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 интерфейс

Смежные вопросы