【问题标题】:How to remove code duplication in this java code如何删除此 java 代码中的代码重复
【发布时间】:2021-09-11 13:47:42
【问题描述】:

在两种不同的方法中使用相同的 for-each 循环,有什么方法可以减少代码重复?

第一个代码

for (AjaxControlBean controlBean : requestData.getControls()) {
    if (StringUtils.isAnyBlank(controlBean.getId(), controlBean.getName()) || "repeat".equalsIgnoreCase(controlBean.getType())) 
    {
        continue;
    }
    FormInstanceControl control = formInstance.getControl(controlBean.getId());
    if (control == null) {
       control = new FormInstanceControl();
       control.setFormInstance(formInstance);
       control.setControlId(controlBean.getId());
       formInstance.putControl(control);
    }
    if (controlBean.getValues() != null) {
       if (control.getData() != null)
          control.getData().clear();
       else
          control.setData(new ArrayList<FormInstanceData>());

       for (String value : controlBean.getValues()) {
           FormInstanceData data = new FormInstanceData();
           data.setControl(control);
           data.setType(FormInstanceData.TYPE_TEXT);
           data.setText(value);
           control.getData().add(data);
       }
    }
}

第二个代码

for (AjaxControlBean controlBean : requestData.getControls()) {
     if (StringUtils.isAnyBlank(controlBean.getId(), controlBean.getName()) || "repeat".equalsIgnoreCase(controlBean.getType())) {
         continue;
     }
     FormInstanceControl control = formInstance.getControl(controlBean.getId());
     if (control == null) {
        control = new FormInstanceControl();
        control.setFormInstance(formInstance);
        control.setControlId(controlBean.getId());
        formInstance.putControl(control);
     }
     if (controlBean.getValues() != null) {
        if (control.getData() != null) {
            control.getData().clear();
        } 
        else 
        {
            control.setData(new ArrayList<FormInstanceData>());
        }
        int i = 0;
        for (String value : controlBean.getValues()) {
            FormInstanceData data = new FormInstanceData();
            data.setControl(control);
            data.setType(FormInstanceData.TYPE_TEXT);
            data.setText(value);
            data.setIdx(i++);
            control.getData().add(data);
        }
    }
}

它唯一的区别是 data.setIdx(i++);请告诉我是否有什么办法可以减少行数

【问题讨论】:

  • 是同一个班吗?为什么这被标记为“ajax”?
  • 在第一个sn-p中,如果你也在那里设置索引会破坏任何东西吗?还是在这种情况下就被忽略了?
  • 同级
  • 您可以分解出一个将FormInstanceControlAjaxControlBean 作为参数的方法。那么你就得到了你需要的一切。

标签: java foreach


【解决方案1】:

您可以分解出一个将FormInstanceControlAjaxControlBean 作为参数的方法。然后你就得到了你需要的一切:

private void addBeanData( FormInstanceControl control, AjaxControlBean controlBean) {
    int i = 0;
    for (String value : controlBean.getValues()) {
        FormInstanceData data = new FormInstanceData();
        data.setControl(control);
        data.setType(FormInstanceData.TYPE_TEXT);
        data.setText(value);
        data.setIdx(i++);
        control.getData().add(data);
     }
}

这假设,如果设置了 Idx,则第一个 sn-p 不会中断,即使它没有在原始代码中完成。

用法:在使用 for 循环之前,您只需执行 addBeanData( control, controlBean );

【讨论】:

  • 嘿,我也可以这样做吗? Idx 不是那么重要,所以我可以在一个方法中使用以上两个代码,通过传递这些参数 private void addBeanData(AjaxDataBean requestData, FormInstance formInstance) { for (AjaxControlBean controlBean : requestData.getControls())
  • 基本上:如果你有两段相同的代码,你可以把它做成一个方法。如果那段代码“使用”了某些东西,请将其作为参数传递。这就是它的要点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多