【发布时间】:2017-10-01 06:39:04
【问题描述】:
我正在开发一个旧的 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;
}
}
有什么方法可以避免重复吗?
【问题讨论】:
-
您可以创建某种
DefaultExcelAction来扩展ExcelExport并实现通用功能,然后让BudgetReportExcelAction(和其他子类)扩展DefaultExcelAction而不是ExcelExport。 -
好吧,我在这里看不到任何重复...是的,您必须覆盖方法,但这就是 OOP 的重点。
-
SonarQube 可以,但正如其他 cmets 所述,这可能是一种偏执的配置......
标签: java oop design-patterns abstract-class