我可以将String映射到java中的方法吗?

Der*_*rek 5 java string methods map

我正在用Java编写表达式求值程序.我希望能够添加更多运算符(我目前只有(,),+, - ,*,/和^).目前,我的代码如下所示:

case '+':  
return a+b;  
case '-':  
return a-b;  
case '*':  
return a*b;  
...
Run Code Online (Sandbox Code Playgroud)

这适用于我的代码,因为我只有几个运算符.但是,如果我要添加更多运算符,代码就会变得混乱.我正在寻找一种方法将运算符(由String表示)映射到方法.例如,"ln"将映射到Math.log(),"^"将映射到Math.pow()等.

我该怎么做呢?如果不可行,有哪些替代方案?

Ion*_*tan 6

除非你想使用反射,否则不可能.没有反射的解决方案可能如下所示:

public interface Operation {
  int apply(int... operands);
}

public abstract class BinaryOperation implements Operation {
  @Override
  public int apply(int... operands) {
    return apply(operands[0], operands[1]);
  }

  abstract int apply(int a, int b);
}

Map<String, Operation> operations = new HashMap<String, Operation>() {{
  put("+", new Operation() {
    @Override
    public int apply(int... operands) {
      return operands[0] + operands[1];
    }
  });
  put("-", new BinaryOperation() {
    @Override
    public int apply(int a, int b) {
      return a - b;
    }
  });
}};
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 5

您可以使用模板方法。

public enum Functions {
    ADD() {
        @Override public int execute(int a, int b) {
            return a+b;
        }
    },
    SUB() {
        @Override public int execute(int a, int b) {
            return a-b;
        }
    };

   //Template method
   public abstract int execute(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)

然后在字符串和枚举之间映射Map<String, Functions> functionMap 所以如果你想添加你可以做functionMap.put("+", Functions.ADD); 然后调用functionMap.get("+").execute(a,b);

我想如果不同的函数采用不同数量的参数,您也可以使用可变参数。 public abstract int execute (Integer... inputs);

这个例子是根据Making Most of Java 5.0: Enum Tricks和 @duffymo 所说的修改的。


Jes*_*mos 0

我认为你的设置是最佳设置,因为我想不出一种方法可以在 java 中轻松做到这一点,尽管在像 c/c++ 这样的语言中,你可以轻松地将字符串映射到函数指针,但我不认为在Java 据我所知。switch 语句的优点在于它们实际上避免了混乱,因为从视觉上你可以很容易地看到 switch 语句的情况是什么,并且只需查找你想要的适当的情况(尽管对于你创建的字符串需要一个巨大的 if 级联,因为 = = 运算符在 java 中没有重载用于字符串比较)。

编辑:请参阅 Ryan Stewarts 评论,他们使用 OOP 方法完全按照您的要求进行操作。尽管在某些情况下这看起来比 switch 语句更混乱。