Java 模拟函数指针

Java 模拟函数指针,java,callback,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(

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

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) 
    {


    }
}
包积分;
导入java.lang.*;
公共类积分
{
公共静态双f1(双x)
{
返回x*5+Math.sin(x);
}   
公共静态双f2(双x)
{
返回数学功率(x*f1(-x),x);
}        
公共静态双梯形积分(双a、双b、整数n、双(*f)(双))
{
双右值=0;
双dx;
dx=(b-a)/n;

对于(double)i=f(a);i这个答案对于不支持闭包或回调的Java7或更少版本有效

首先,使用计算整数值的方法定义一个抽象类或接口。对于此示例,我将定义一个接口:

interface IntegralCalculation {
    double getIntegralValue(double x);
}
在实际代码中,让我们替换接口的
double(*f)(double)
参数和要使用的方法:

public static double TrapezoidalIntegration(double a,double b,int n, IntegralCalculation integralCalc) {
    double rValue;
    double dx;

    dx=(b-a)/n;
//对于(int i=f(a);i 现在,在您的
main
方法中(或您将调用此
梯形集成
方法的任何其他地方),传递接口的实现。您可以传递实现接口的类的实例或匿名类

使用实现接口的类的类实例的示例(抱歉,不知道其他说法):

使用:

根据上述代码:

  • 您不能在Java中传递函数指针,因此
    double(*f)(double)
    参数将无效,相反,我们使用抽象类或接口。接口会更好
  • 设计接口后,它必须有一个满足函数指针规则的方法。在这种情况下,
    double(*f)(double)
    表示一个方法,该方法使用
    double
    作为参数,并返回一个
    double
    值。这由
    getIntegralValue
    方法处理
  • 梯形积分
    方法中将函数指针替换为接口参数后,应调用
    getintegrationvalue
    ,就像调用函数指针一样:

     for(int i = integralCalc.getIntegralValue(a);
        i < integralCalc.getIntegralValue(b); i += dx) { ... }
    
    for(int i=integracalc.getIntegralValue(a);
    i
在这种情况下如何进行回调?我更喜欢避免回调,因为它既复杂又丑陋。即使是最不痛苦的回调,我也不知道如何在这里实现它

因为Java中没有函数指针,所以您必须使用公共接口。然后,您的函数必须是该接口的实现。这取决于您是否要使用那些实现类的名称(即
类F1扩展函数{…}
)或匿名类(即
新函数){…}
)。这也取决于您是在该类中编写imp0实现,还是让该类实现调用现有的静态函数之一

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

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

1) 创建一个声明要传递的方法的接口;2)创建一个实现该接口的匿名类(
newmyinterface(){int methodIDefined([args I defined]){[implementation of method]};
);3)如果函数指针调用,则传递该类;4)调用它:
nameOfArgument.methodIDefined();
。可能重复“错误:函数是抽象的;无法实例化”@0x6B6F776616C74:已更正,可能应该在发布之前通过编译器运行该命令…
 for(int i = integralCalc.getIntegralValue(a);
    i < integralCalc.getIntegralValue(b); i += dx) { ... }
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