我在java中创建一个CronJob函数,如下所示:
public class CronJob {
public static int mSeconds;
public static String task; //?¿?¿
public CronJob(int mSeconds, String task) {
this.mSeconds = mSeconds;
this.task = task;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
//EJECUTE TASK
//testFunction();
}
}, 0, mSeconds);
}
...
}
在我的主要功能中,我想执行类似的操作:
new CronJob(3000, testFunction());
我不知道如何将函数名称传递给CronJob类以及我应该使用哪种变量。
感谢。
答案 0 :(得分:1)
您无法在Java中将函数作为参数传递。相反,您需要传递实现感兴趣功能的已知接口的对象:
interface MyTask {
void performTask();
}
...
public CronJob(int mSeconds, MyCallback task) {
...
}
...
public void run() {
task.performTask();
}
换句话说,您需要遵循使用计时器安排任务时使用的相同模式,并传递新TimerTask
的实例。当然,实现不需要是匿名的。也没有必要定义自己的接口来进行回调:您可以重用Java类库中可用的一个接口,例如Runnable
。
答案 1 :(得分:0)
您只需要为您的任务使用界面而不是String
。 Runnable对你来说是一个不错的选择,但如果你需要更具体的东西,你可以扩展它或创建自己的界面。
答案 2 :(得分:0)
Java中有三种方法。
1)传递一个对象,该对象上有一个提供所需功能的方法。
例如
new CronJob(3000, new Runnable() {
public void run() {
System.out.println("I ran");
}
});
直到Java 8,这几乎是唯一的选择。在Java 8之后,我们还有两种方法:
2)使用lambda,它实际上只是语法糖,用于创建只有一个方法的接口实现。
new CronJob(3000, () -> System.out.println("I ran"));
可以阅读Lambdas here
Lambdas可以接受参数,他们也可以从声明的上下文中访问字段和最终变量。它们不是完全闭包,因此变量必须是有效的final,这意味着它们不需要被声明为final,因为Java 8编译器会为我们解决它。
例如:
public void scheduleJob( String name ) {
new CronJob(3000, () -> System.out.println("Hello "+name));
}
如果一个人正在使用一个接口,其方法接受一个参数,那么它可能看起来像这个
public interface Job {
public void doJob( String arg );
}
public void scheduleJob() {
new CronJob(3000, arg -> System.out.println("Hello "+arg));
}
3)传递现有的method by reference,例如
private void theTaskMethod(){ System.out.println(“我跑”); }
new CronJob(3000,() - > this :: theTaskMethod);
如果想要将此方法与其方法采用参数的接口一起使用,则方法引用必须指向也采用相同类型的参数的方法。例如
如果一个人正在使用一个接口,其方法接受一个参数,那么它可能看起来像这个
public interface Job {
public void doJob( String arg );
}
public void scheduleJob() {
new CronJob(3000, System.out::println); // would print out what ever arg was past to doJob(arg)
}