在JAVA中从用户输入中调用方法

时间:2018-09-06 15:39:38

标签: java user-input shortcut

我正在寻找一种方法来调用类中的任何给定方法,而不必执行整个try-catch语句。

示例:

public void Worker(String handle) throws Exception
{
    if(PROTOCOL.contains(handle)) 
    {
        System.out.println("good");
        Worker.handle;
    }
    else { 
            throw new Exception("Don't understand <" + handle + ">");
         }
}

PROTOCOL是允许的命令列表。

我知道我可以说if(input = ....){do....},但我希望能够做到以上几点;用输入值调用我的班级。

这可能吗?

3 个答案:

答案 0 :(得分:1)

根据命令的外观,可以使用Map<String, Command>,然后像这样使用:

Map<String, Command> PROTOCOL = ... //you build that map somehow

Command c = PROTOCOL.get(handle);
if( c != null ) {
    System.out.println("good");
    c.execute();
} else { 
    throw new Exception("Don't understand <" + handle + ">");
}

Command可以是类或函数接口:

interface Command {
  void execute();
}

用作课程界面

class MyCommand implements Command {
  //this can have private data

  void execute() {
    //do whatever is needed
  }
}

PROTOCOL.put("mycommand", new MyCommand(/*you could pass parameters here*/));

优势:

  • 该界面可以使用多种方法,例如它也可以有一个String getName()
  • 命令可以具有参数,例如您可以提供一种实现方式,并使用具有不同参数的相同名称绑定到同一命令(例如,可以将“递增”和“递减”绑定到AddCommand(1)AddCommand(-1))。
  • 您可以使用某种依赖性反转机制(例如,通过CDI)使命令将自身注册到PROTOCOL。这样,您甚至可以通过某种插件机制添加命令。
  • 使用类的接口对于其他人可能更容易理解。
  • 对于大型命令,结构更容易,因为您可以轻松地将类提取到单独的文件中。

用作功能接口(例如通过lambda)

PROTOCOL.put("mycommand", () -> { 
  //do whatever is needed
});

优势:

  • 不需要类,对于简短的命令,这些类可能更简洁。

答案 1 :(得分:0)

如果您不想使用try-catch(自己处理异常),请在throws关键字之后,在调用方法上声明这些异常。

https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

基本上,您是将异常处理委托给方法的调用者。

答案 2 :(得分:0)

这是一个简单的工作示例,显示了您可以使用reflection进行的某些操作。

注意:我决定将可用方法存储在列表中,但是可以很容易地将其修改为使用预定义的字符串列表。我还从worker方法中抛出了一个未经检查的IllegalArgumentException。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Worker {

    public void method1() {
        System.out.println("method1 called");
    }

    public void method2() {
        System.out.println("method2 called");
    }

    public void worker(String handle) throws IllegalArgumentException {
        Class<? extends Worker> clazz = this.getClass();
        List<Method> methods = Arrays.asList(clazz.getMethods());

        if (methods.stream().map(m -> m.getName()).collect(Collectors.toList()).contains(handle)) {
            try {
                Method method = clazz.getDeclaredMethod(handle);
                method.invoke(this);
            } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            throw new IllegalArgumentException("Don't understand <" + handle + ">");
        }
    }

    public static void main(String[] args) {
        new Worker().worker("method1");
        new Worker().worker("method2");
        new Worker().worker("method3");
    }
}