如何通过抽象类实现Java等效的函数指针

时间:2011-02-22 04:53:10

标签: 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



    }
}

非常感谢任何有关正确方向的步骤的帮助或想法! 提前谢谢!

3 个答案:

答案 0 :(得分:3)

让我们试试这个:

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,Second Edition

值得指出的是,Java没有“函数指针”的概念。相反,您只需编写一个接口并编写一个实现该接口的类。在运行时选择要使用的正确类;因此,这是一个“跳转表”,但它隐藏在面向对象编程的语义背后。这称为多态

答案 1 :(得分:2)

虽然这很不错(除了没有正常工作的构造函数),我会使用匿名类做不同的。

abstract class Functor {


    public abstract double compute(double a, double b);

    public static void main(String[] args) {
        Functor add = new Functor() {
            // defining it here is essentially how you do a function pointer
            public double compute(double a, double b) { return a + b; }
        };

        Functor subtract = new Functor() {
            public double compute(double a, double b) { return a - b; }
        };

        System.out.println(add.compute(1.0,2.0));
        System.out.println(subtract.compute(1.0,2.0));

    }

}

结果:

C:\Documents and Settings\glowcoder\My Documents>java Functor
3.0
-1.0

C:\Documents and Settings\glowcoder\My Documents>

答案 2 :(得分:0)

你没有任何构造函数可以传递给你的子类的任何参数,我不明白你如何设置opt1opt2将被设置为没有任何构造函数作为参数。现在这不是正确的Java代码。