作为Java中的参数

时间:2014-09-21 12:21:21

标签: java function timer parameters cron

我在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类以及我应该使用哪种变量。

感谢。

3 个答案:

答案 0 :(得分:1)

您无法在Java中将函数作为参数传递。相反,您需要传递实现感兴趣功能的已知接口的对象:

interface MyTask {
    void performTask();
}
...
public CronJob(int mSeconds, MyCallback task) {
    ...
}
...
public void run() {
   task.performTask();
}

换句话说,您需要遵循使用计时器安排任务时使用的相同模式,并传递新TimerTask的实例。当然,实现不需要是匿名的。也没有必要定义自己的接口来进行回调:您可以重用Java类库中可用的一个接口,例如Runnable

答案 1 :(得分:0)

您只需要为您的任务使用界面而不是StringRunnable对你来说是一个不错的选择,但如果你需要更具体的东西,你可以扩展它或创建自己的界面。

答案 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)
}
相关问题