java - 如何通过抽象类实现函数指针的 Java 等价物

标签 java class function pointers abstract

我正在尝试使用不带 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.PLUSOperation.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/

相关文章:

java - BottomNavigationView getmaxitemcount

class - 在 F# 中创建类或记录时的自引用

java - 在类中设置值不起作用

javascript - 通过 JavaScript 函数创建 div 并添加文本

java - 三层架构中的表示层

Java 使用 Vector 类 - Matrix

Golang 中的函数声明

c++ - 查找点积的函数

java - 可以在迭代过程中改变的可迭代集合

python - 作为实例方法调用时行为不同的类方法?