有 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);
}
我想从这两个函数中删除重复的代码。
一个简单的解决方案是编写第三个通用函数并从两个函数调用它。但是我一直在寻找是否有一种方法,我可以使用 Lambda 表达式来传递不同的代码功能。
类似
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>)
最佳答案
如何使用枚举定义来简化调度程序可以执行的所有可能操作
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");
}
}
关于Java使用java函数表达式抽象出通用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60914596/