避免在抽象类的子类上进行代码重复

时间:2017-05-03 12:22:06

标签: java oop design-patterns abstract-class

我正在开发一个旧的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;
    }
}

任何想法如何避免重复?

2 个答案:

答案 0 :(得分:4)

我在这里看到的代码中几乎没有任何代码重复,但是如果你真的想要从石头中榨取水,你可以在基类中添加一个构造函数,它接受输入-filename和output-filename,并使每个派生类将其input-filename和output-filename传递给基类的构造函数。

答案 1 :(得分:2)

这里没有答案:您的示例中没有“代码重复”。

重点是:你的抽象类驱动你的子类的某个“布局”;但这是使用抽象类的本质

换句话说:这里无需担心。

您遵循众所周知的“认可”模式;例如,通过在子类中很好地使用@Override注释。

一切都很好,祝你有愉快的一天!