我正在开发一个旧的Struts应用程序,该应用程序具有抽象操作,可以通过填充Excel模板文件来创建Excel导出。
每个Excel导出操作都会扩展此父类,并添加自己的实现以填充Excel模板并定义自己的模板和输出文件名。
public abstract class ExcelExportAction extends BaseAction {
protected abstract String getInputFilename();
protected abstract String getOutputFilename();
protected abstract HSSFWorkbook modifyWorkbook(HSSFWorkbook workbook, HttpServletRequest request);
@Override
protected final ActionForward run(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
Workbook workbook = new Workbook(getInputFilename());
workbook = modifyWorkbook(workbook, request);
addWorkBookToResponse(workbook, getOutputFilename());
return null;
}
...
}
实现看起来像这样,这就是代码重复的地方"警告"通过SonarQube:
public class BudgetReportExcelAction extends ExcelExportAction {
private static final String INPUT_FILENAME = "Report-Budget-Template.xls";
private static final String OUTPUT_FILENAME = "Report-Customerbudget.xls";
@Override
protected String getInputFilename() {
return INPUT_FILENAME;
}
@Override
protected String getOutputFilename() {
return OUTPUT_FILENAME;
}
@Override
protected HSSFWorkbook modifyWorkbook(HSSFWorkbook workbook, HttpServletRequest request) {
/* modify the workbook */
return workbook;
}
}
任何想法如何避免重复?
答案 0 :(得分:4)
我在这里看到的代码中几乎没有任何代码重复,但是如果你真的想要从石头中榨取水,你可以在基类中添加一个构造函数,它接受输入-filename和output-filename,并使每个派生类将其input-filename和output-filename传递给基类的构造函数。
答案 1 :(得分:2)
这里没有答案:您的示例中没有“代码重复”。
重点是:你的抽象类驱动你的子类的某个“布局”;但这是使用抽象类的本质。
换句话说:这里无需担心。
您遵循众所周知的“认可”模式;例如,通过在子类中很好地使用@Override注释。
一切都很好,祝你有愉快的一天!