我正在尝试使用不带 switch case 或 if/else 语句的跳转表创建一个简单的 4 函数计算器。我知道我可以通过函数指针创建跳转表,但我有点茫然。我从程序的加法和减法部分开始,但我试图掌握要使用的设计/策略。将方法放入数组时我也遇到错误,到目前为止,这就是我所拥有的:
public class Calculator {
public abstract class Functor{
abstract double Compute(double op1, double op2);
}
class Addition extends Functor
{
public double Compute(double op1, double op2){ return op1 + op2;}
}
class Subtraction extends Functor
{
public double Compute(double op1, double op2){ return op1 - op2;}
}
public static void main(String[] args) {
Functor add = new Addition(); // Problem here
Functor sub = new Subtraction(); // and here
}
}
非常感谢任何有助于朝着正确方向迈出的一步的帮助或想法! 提前致谢!
最佳答案
让我们试试这个:
public enum Operation {
PLUS("+") {
double apply(double x, double y) { return x + y; }
},
MINUS("-") {
double apply(double x, double y) { return x - y; }
},
TIMES("*") {
double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
double apply(double x, double y) { return x / y; }
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
@Override public String toString() {
return symbol;
}
abstract double apply(double x, double y);
}
这仅在您使用具有泛型和枚举的 Java 5 或更高版本时才有效。它的作用是为您提供一组静态操作。您可以通过键入 Operation.PLUS
或 Operation.MINUS
等来访问它们。
要测试它试试这个:
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
for (Operation op : Operation.values())
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
有关详细信息,请参阅 Joshua Bloch 的Effective Java,第二版。
值得指出的是,Java 没有“函数指针”的概念。而是简单地编写一个接口(interface)并编写一个实现该接口(interface)的类。在运行时选择要使用的正确类;因此,这是一个“跳转表”,但它隐藏在面向对象编程的语义背后。这称为多态性。
关于java - 如何通过抽象类实现函数指针的 Java 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5074143/