Java абстрагирование общего кода с использованием java Функциональное выражение - PullRequest
3 голосов
/ 29 марта 2020

Есть 2 функции, которые имеют одинаковый кусок кода, за исключением одной строки.

public ResponseEntity<String> deleteJob(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

        if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
            return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

        schedulerFactoryBean.getScheduler().deleteJob(jobKey);//Different Code line
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
    }

public ResponseEntity<String> resumeJob(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

        if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
            return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

        schedulerFactoryBean.getScheduler().resumeJob(jobKey);//Different Code line
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
    }

Я хочу удалить дублирующийся код из обеих функций.

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

Что-то вроде

public ResponseEntity<String> processJob(String jobName, String jobGroup, Function<String,String> jobfunction) {
        JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

        if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
            return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

        jobfunction.apply(jobKey);//Apply the required code behaviour
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
    }

, а затем вызвать функцию как

processJob(jobName,jobGroup, <lambda expression with delete/resume function calling>)

Ответы [ 3 ]

1 голос
/ 29 марта 2020

Как насчет упрощения с помощью enum для всех возможных действий, которые планировщик может выполнить

enum Action {
    DELETE, RESUME
}

, и дальнейшей передачи понимания того, как обрабатывать задание в качестве параметра -

public ResponseEntity<String> processJob(String jobName, String jobGroup, Action action) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

    if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

    performSchedulerAction(schedulerFactoryBean.getScheduler(), jobKey, action);
    return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
}

, который использует private метод, такой как

private void performSchedulerAction(Scheduler scheduler, JobKey jobKey, Action action) {
    switch (action) {
        case DELETE -> scheduler.deleteJob(jobKey);
        case RESUME -> scheduler.resumeJob(jobKey);
        default -> throw new IllegalArgumentException("no such case");
    }
}
0 голосов
/ 29 марта 2020

Возможно, не лучший, но это может быть подходом, вы можете добавить логическое значение в список параметров, чтобы решить, что вы хотите сделать

public ResponseEntity<String> processJob(String jobName, String jobGroup,boolean wantDelete) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobGroup, jobName);

    if (!schedulerFactoryBean.getScheduler().checkExists(jobKey))
        return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("does not exists"), jobName, jobGroup), HttpStatus.BAD_REQUEST);

    if(wantDelete)
    schedulerFactoryBean.getScheduler().deleteJob(jobKey);
    else 
       schedulerFactoryBean.getScheduler().resumeJob(jobKey);

    return new ResponseEntity<>(format(JOBNAME_JOBGROUP_COMMON_LOG.concat("deleted Successfully"), jobName, jobGroup), HttpStatus.OK);
}
0 голосов
/ 29 марта 2020

Вы можете использовать тип Function в java: https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

Представляет функцию, которая принимает один аргумент и выдает результат.

...