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