2014-09-21 3 views
1

я делаю функцию CronJob в Java, кажется, что это:функции в качестве параметра в Java

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

возможного дубликата [Java Pass метода в качестве параметра] (http://stackoverflow.com/questions/2186931/java-pass-method-as-parameter) – mkazma

ответ

0

В Java существует три подхода.

1) Передайте объект, на котором есть метод, который предоставляет необходимые вам функциональные возможности.

Например

new CronJob(3000, new Runnable() { 
    public void run() { 
     System.out.println("I ran"); 
    } 
}); 

До Java 8, который был в значительной степени единственный вариант. После Java 8 у нас есть еще два подхода:

2) Используйте лямбда, которая под капотом - действительно просто синтаксический сахар для создания реализации интерфейса только с одним методом.

new CronJob(3000,() -> System.out.println("I ran")); 

можно прочитать на Лямбдах here

Лямбд могут принимать аргументы, и они могут также получить доступ к полям и конечным переменным из их объявляющего контекста. Они не являются полными закрытиями, поэтому переменные должны быть окончательно окончательными, а это значит, что их не нужно объявлять окончательными, поскольку компилятор 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 («Я побежал»); }

новый 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) 
} 
+0

Если я использую ваш параметр 3º, какую переменную я должен использовать в классе CronJob, чтобы almacenate второй параметр? –

+0

@ BorjaSanchidriánMonge аргументы должны совпадать с интерфейсом, в моем примере я использовал Runnable, который объявил run(), аргумент arg. Я добавлю еще один пример, который принимает аргумент. –

+0

спасибо, я только что начал программировать в java вчера, и я немного потерялся с этим –

1

Вы не можете передать функцию в качестве параметра в Java. Вместо этого вам нужно передать объект известного интерфейса, который реализует функцию интереса:

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

Другими словами, вы должны следовать той же схеме, которая используется при планировании задачи с таймером, проходя экземпляр нового TimerTask. Конечно, реализация не обязательно должна быть анонимной. Также нет необходимости определять свой собственный интерфейс для выполнения обратных вызовов: вы можете повторно использовать один из интерфейсов, доступных в библиотеке классов Java, например Runnable.

0

Вам просто нужно использовать интерфейс для своей задачи, а не String. Runnable будет хорошим выбором для вас, но если вам нужно что-то более конкретное, вы можете расширить его или создать свой собственный интерфейс.

Смежные вопросы