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

问题描述 投票:1回答:3

我正在寻找一种方法来调用我的类中的任何给定方法,而无需执行整个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....}但我希望能够做到这一点;用输入值调用我的类。

这可能吗?

java user-input shortcut
3个回答
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。这样你甚至可以通过一些插件机制添加命令。
  • 使用类的接口可能更容易掌握其他人。
  • 更容易构建更大的命令,因为您可以轻松地将类提取到单独的文件中。

用作函数接口(例如通过lambdas)

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

好处:

  • 不需要任何类,对于短命令可以更简洁。

0
投票

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

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

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


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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.