当前位置: 首页 > 知识库问答 >
问题:

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

云宾鸿
2023-03-14

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

沃宇
2023-03-14

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

关键是:抽象类驱动子类的特定“布局”;但这是使用抽象类的本质。

换句话说:这里没什么好担心的。

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

一切都好,祝你愉快!

沙小白
2023-03-14

我在这里看到的代码中几乎没有任何代码重复,但是如果您真的想“从石头中挤水”,您可以向基类添加一个构造函数,它接受输入文件名和输出文件名,并使每个派生类将其输入文件名和输出文件名传递给基类的构造函数。

 类似资料:
  • 此外,我不想将开发人员从ProjectManager转移到JavaProjectManager,因为我有更多从ProjectManager扩展的类,需要开发人员。

  • 我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类:

  • 我的(简化)情况: Service@webservice 容器getContainer()@webmethod 容器 无效setObjects(ContainableObjects[]objects) ContainableObjects[]getObjects() ContainedInt[extends ContainableObject] void setValue(int value) i

  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边

  • 目前有4种组合 增加小时。 增加天数。 减去小时。 减去天。 如果增加了一个新的期间(比如年),则有必要在每种情况下添加一个新的If语句: 此外,如果添加了新的意外情况(组合,特别是情况),则有必要重复逻辑以验证周期。 您有改进解决方案的建议吗?模式推荐,功能接口实现,欢迎任何推荐。 提前谢谢!