Рекурсивное выполнение вызовов - PullRequest
0 голосов
/ 22 мая 2018

Задание определяется следующим образом:

class Job<T> {
  String Class<T> type;

  T execute() throws Exception {
    return type.newInstance();
  }

  static <T> T execute(Job<T> aJob, Job<T>... jobs) {
    //... some lines of unrelated code...
    try{        
      return aJob.execute();
    } catch(Exception e){
      if(jobs.length == 0) throw new RuntimeException(e);
      return execute(jobs[0], Arrays.copyOfRange(jobs, 1, jobs.length));
    }
  }
}

Рекурсия необходима для повторного использования блока try-catch.Если одна работа не удается, я вызываю следующую работу.Когда ни одно из заданий не является успешным, я выбрасываю RuntimeException, оборачивая фактическое исключение.Это всего лишь запасной механизм.Код не такой же, как у меня, но он имеет ту же структуру.

Меня беспокоит рекурсивный вызов для выполнения:

execute(jobs[0], Arrays.copyOfRange(jobs, 1, jobs.length));

Я мог бы также использоватьОчередь вместо массива:

T execute(Job<T> aJob, Queue<Job<T>> jobQueue) {  
//...
execute(jobQueue.poll(), jobQueue);
//...

Я думал, что использование массива даст лучшую производительность.Но использование очереди делает код более читабельным и интуитивно понятным.Я не проверял производительность ни одного варианта, хотя.

  1. Какая структура данных даст лучшую производительность?
  2. Есть ли лучший способ сделать этот рекурсивный вызов?
  3. Было бы лучше использовать дляцикл вместо рекурсии?

Спасибо

1 Ответ

0 голосов
/ 22 мая 2018

В этом случае, я думаю, вы не хотите многократно копировать снова и снова, поскольку вы работаете только с одним массивом.

static <T> T execute(Job<T> aJob, int begin, Jobs[] jobs) {
    //... some lines of unrelated code...
    try{        
      return aJob.execute();
    } catch(Exception e){

      // if(jobs.length == 0) throw new RuntimeException(e);
      // The condition changed to begin < jobs.length

      if (begin == jobs.length) throws ... // End of array already

      return execute(jobs[0], begin + 1, jobs); // Advance to the next index. No need to copy the array
    }
}

Мы просто работаем с одним массивом, нет необходимостископировать.

...