模拟函数指针

0x6*_*C74 3 java callback

以下类包含一个应使用回调技术计算积分的方法.

package integrals;

import java.lang.*;

public class Integrals 
{
    public static double f1(double x)
    {
        return x*5+Math.sin(x);
    }   

    public static double f2(double x)
    {
        return Math.pow(x*f1(-x),x);      
    }        

    public static double TrapezoidalIntegration(double a,double b,int n,double (*f)(double))
    {
        double rValue=0;
        double dx;

        dx=(b-a)/n;

        for(double i=f(a);i<f(b);i+=dx)
            rValue+=((f(i)+f(i+dx))*dx)/2.0;

        return rValue;
    }        

    public static void main(String[] args) 
    {


    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下如何进行回调?由于它的复杂性和丑陋性,我宁愿避免使用这种解决方案.即使它是最不痛苦的,我也不知道如何在这里实现它.

MvG*_*MvG 5

在这种情况下如何进行回调?由于它的复杂性和丑陋性,我更愿意避免这种解决方案.即使它是最不痛苦的,我也不知道如何在这里实现它.

由于Java中没有函数指针,因此必须使用通用接口.然后,您的功能必须是该接口的实现.是否要为实现类(即class F1 extends Function { … })或匿名类(即new Function { … })使用名称取决于您.您是否在该类中编写impollementation,或者让类实现调用您现有的静态函数之一,也取决于您.

举一个例子,使用直接包含实现的匿名类:

public class Integrals 
{

    public interface Function {
        double eval(double x);
    }

    public static final Function f1 = new Function() {
      public double eval(double x) {
        return x*5+Math.sin(x);
      }
    };

    public static final Function f2 = new Function() {
      public double eval(double x) {
        return Math.pow(x*f1.eval(-x),x);
      }
    };

    public static double TrapezoidalIntegration(double a,double b,int n,Function f)
    {
        // … using f.eval(x) to compute values
Run Code Online (Sandbox Code Playgroud)