java - 句柄操作符的动态程序

标签 java

我有一个处理数学运算符(+、*、-、/)的程序。我有一个接口(interface)运算符,它具有如下计算方法:

public interface Operator
{
    double calculate(double firstNumber,double secondNumber);
}

我有四个类(Plus、Minus、Divide、Multiply),它们实现了 Operator 接口(interface),如下所示:

public class Plus implements Operator
{   
    public double calculate(double firstNumber,double secondNumber)
    {
        return firstNumber + secondNumber;
    }
}

public class Minus implements Operator
{
    public double calculate(double firstNumber,double secondNumber)
    {
        return firstNumber - secondNumber;
    }
}

等等...

我使用 Map 来处理运算符:

static Map<String,Operator> operatorMap = new HashMap<String,Operator>();
static
{
    operatorMap.put("+", new Plus());
    operatorMap.put("-", new Minus());
    operatorMap.put("*", new Multiply());
    operatorMap.put("/", new Divide());
}

double output = operatorMap.get(op).calculate(firstNumber,secondNumber);

我应该像这样更改程序:

我有一个文件夹(myfolder)。每个人都可以获取接口(interface)并实现自己的运算符,并将.class文件放入myfolder中。我的程序也应该可以工作。这意味着对(+,*,-,/)的依赖应该删除从我的程序。 例如,有人获取了 Operator 接口(interface)并实现了 % 并将 .class 文件放入我的文件夹中,我的程序仍然应该工作( map 实现必须更改) 谁能帮我? 我非常感激。

最佳答案

所以你的意思是你将为一个新的运算符创建一个新类,并且程序应该自动选择它。如果是这种情况,您可以使用 Reflection API迭代实现 Operator 接口(interface)的可用类。然后将它们添加到您的 map 中。

要删除对 hashmap 的依赖,您可以在 Operator 界面中添加一个新方法,如下所示:

public interface Operator
{
  double calculate(double firstNumber,double secondNumber);
  char getSign();
}

所有类(如 Plus、Minus)都将返回一个映射到其符号的字符。

public class Plus implements Operator
{   
  public double calculate(double firstNumber,double secondNumber)
  {
     return firstNumber + secondNumber;
  }
  public char getSign()
  {
     return '+';
  }
}

接下来,在您的 calculate(char operator, int operand1, int operand2) 方法中,您可以首先迭代所有实现 Operator 接口(interface)的类(使用反射),然后调用 get Sign 并将其与传递给此方法的运算符参数,如果符号与运算符匹配,则将操作数传递给 Operator.calculate() 方法。要获取所有实现 Operator 接口(interface)的类,您可以使用以下代码:

Reflections reflections = new Reflections("mypackage");
Set<Class<? extends Operator>> classes = reflections.getSubTypesOf(Operator.class);

希望您现在明白了。

关于java - 句柄操作符的动态程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32174571/

相关文章:

java - 如何正确关闭方法内的 Scanner 类?

java - keystore 密码恢复 android

java - 强制应用等待发送新短信

java - 如何检查 JCheckBox 的状态?

java - 如何使用 Mockobject 检查真实对象的空值?

java - 查找两个数组中相同的重数

java - 通过对象实例中包含的变量而不是数组编号来搜索数组?

java - 如何将 !.equals 与字符串一起使用?

java - 外部java程序: Handle SIGTERM

java - 根据对象中的变量从对象列表中获取对象