我有一个大约十行代码的方法.我想创建更多完全相同的方法,除了一个会改变一行代码的小计算.这是传递函数指针以替换该行的完美应用程序,但Java没有函数指针.什么是我最好的选择?
我有一个类包含10个方法,除了一个键事件之外,它们几乎完成相同的操作.下面给出两个例子:
Public String ATypeOperation(String pin, String amount){ doSomething(); doMoreStuff(); requestBuilder.buildATypeRequest(pin, amount); doAfterStuff(); }Public String BTypeOperation(String name, String sex, String age){ doSomething(); doMoreStuff(); requestBuilder.buildBTypeRequest(name, sex, age); doAfterStuff(); }
从上面的方法可以看出,它们与调用requestBuilder提供的不同方法类似.其余的8也是类似的.这里有很多重复的代码.我觉得有更好的方法来实现这一点,但不知道如何实现.任何想法和建议表示赞赏.
谢谢,莎拉
我Screen在C#中有一个简单的类,它包含一堆事件(带有相应的委托)FadeOutEvent.
我想将我的库移植到Java,我发现事件/代理的机制真的很笨拙.具体来说,我不能轻易编写如下代码:
if (someVar == someVal) {
this.FadeOutComplete += () => {
this.ShowScreen(new SomeScreen());
};
} else {
this.FadeOutComplete += () => {
this.ShowScreen(new SomeOtherScreen());
};
}
Run Code Online (Sandbox Code Playgroud)
对于所有只有Java的人来说,基本上,我正在抱怨的是无法动态地将当前类中的事件处理方法重新分配给其他东西而不创建新类 ; 似乎如果我使用接口,当前类必须实现接口,我不能更改稍后调用的代码.
在C#中,通常有以下代码:
策略模式可以解决这个问题(并且确实如此),尽管我需要额外的类和接口来完成它; 在C#中,它只是一个decarative事件/委托,我已经完成了.
没有内部/匿名类,有没有办法做到这一点?
编辑:我刚看到这个问题,这可能会有所帮助.
以下类包含一个应使用回调技术计算积分的方法.
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)
在这种情况下如何进行回调?由于它的复杂性和丑陋性,我宁愿避免使用这种解决方案.即使它是最不痛苦的,我也不知道如何在这里实现它.
在你标记为dup之前,是的,我已经在Java中看到了函数指针,不,它没有真正回答我的问题,主要是因为我对Java很新,所以我真的不明白所有的答案.
这是一些混乱的Java/C++,有没有合理的方法在Java中做到这一点?
public class Foo {
private int _data;
/* various other functions */
public boolean test1( Foo other ) { /* do test */ }
public boolean test2( Foo other ) { /* do test */ }
public boolean test3( Foo other ) { /* do test */ }
public boolean test4( Foo other ) { /* do test */ }
}
public class Bar {
private Foo[] _foos = { /* Init an array …Run Code Online (Sandbox Code Playgroud) 在 Java 中,我想定义一个规范化函数,该函数将一个数字作为输入,但其行为由多个参数定义。
本质上,在 Lisp 中的 Java 等价物是:
(define (normalizeVal min max floor ceiling)
(lambda (x) (/ (* (- ceiling floor) (- x min)) (+ (- max min) floor))))
Run Code Online (Sandbox Code Playgroud)
在伪代码中,我想:
function parsing(data, normalizeValFunc) {
for (datum in data):
normalizeValFunc(datum);
}
var input = userData;
var min, max, floor, ceiling = /* Calculate min, max, floor, and ceiling */
var output = parsing(input, normalizeValFunc(min, max, floor, ceiling));
Run Code Online (Sandbox Code Playgroud)
在 Java 中将函数作为参数传递可能很棘手,因为函数在 Java 中不是一等对象。(也许 Java 8 Lambda 表达式会改变这一点?)其他问题解决了在 Java …
可能重复:
Java中函数指针的最接近的替代是什么?
我只是有一种情况,如果你可以在c或c ++中使用类似于函数指针的功能,那就太好了.我能想到的最好的事情是组合Runnables并在不同的线程中启动它们.建议?
我对Java很新,我想知道是否有办法以某种方式改变类的功能.
Class pager = new Pager();// everything is initialized
pager.dostuff() = function(){};
Run Code Online (Sandbox Code Playgroud)
是否有特定的名称,是否可以用Java做?如果没有,是否有允许它的语言?
感谢您的时间.
编辑:
澄清这个问题,因为最初似乎我想用不同的函数初始化新类.事实并非如此.我想在它已经创建之后改变它.这样做的原因是我正在使用android,我得到的类是来自xml.当我像这样上课时,是否可以改变班级的功能?
Pager pager = (ViewPager) findViewById(R.id.pager)
Run Code Online (Sandbox Code Playgroud)
我觉得我将不得不创建一个新课程,这是好的,但我想知道我是否可以这样做.