有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型Java,不同对象的重复逻辑块,清理代码

我想清理一些让我头疼的代码:

    activityStandardAttributeValue
            .setProduct((standardAttributeForm != null && standardAttributeForm
                    .getProduct() != null) ? standardAttributeForm
                            .getProduct()
                            : (groupedStandardAttributeForm != null ? groupedStandardAttributeForm
                                    .getProduct() : null));
    activityStandardAttributeValue
            .setProject((standardAttributeForm != null && standardAttributeForm
                    .getProject() != null) ? standardAttributeForm
                    .getProject()
                    : (groupedStandardAttributeForm != null ? groupedStandardAttributeForm
                    .getProject() : null));

我可以简单地将其更改为更易于阅读的形式,如:

    Product product = null;
    if(standardAttributeForm != null && standardAttributeForm.getProduct() != null) {
        product = standardAttributeForm.getProduct();
    } else if (groupedStandardAttributeForm != null && groupedStandardAttributeForm.getProduct() != null) {
        product = groupedStandardAttributeForm.getProduct();
    }
    activityStandardAttributeValue.setProduct(product);

    Project project = null;
    if(standardAttributeForm != null && standardAttributeForm.getProduct() != null) {
        project = standardAttributeForm.getProject();
    } else if (groupedStandardAttributeForm != null && groupedStandardAttributeForm.getProject() != null) {
        project = groupedStandardAttributeForm.getProject();
    }

问题是,对于不同的属性,相同的基本逻辑重复了大约16次,并且实际上没有太多的清理。我想创建一个通用的方法来实现这一点,而不必重复相同的基本逻辑。棘手的是standartAtributeForm或groupedStandardAttributeForm可能为空

感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    这并不是一个真正的答案,但它太大,无法在评论中发布(并且取决于格式):

    只需使用更好的格式就可以更容易阅读。以下是通过google-java-format传递的代码:

    activityStandardAttributeValue.setProduct(
        (standardAttributeForm != null && standardAttributeForm.getProduct() != null)
            ? standardAttributeForm.getProduct()
            : (groupedStandardAttributeForm != null
                ? groupedStandardAttributeForm.getProduct()
                : null));
    activityStandardAttributeValue.setProject(
        (standardAttributeForm != null && standardAttributeForm.getProject() != null)
            ? standardAttributeForm.getProject()
            : (groupedStandardAttributeForm != null
                ? groupedStandardAttributeForm.getProject()
                : null));
    

    我想你可以这样做:

    <T> getThing(Function<Form, T> extractor, T... forms) {
      for (T form : forms) {
        if (form != null) {
          T thing = extractor.apply(form);
          if (thing != null) return thing;
        }
      }
      return null;
    }
    

    然后:

    activityStandardAttributeValue.setProduct(
        getThing(Form::getProduct, standardAttributeForm, groupedStandardAttributeForm));
    activityStandardAttributeValue.setProject(
        getThing(Form::getProject, standardAttributeForm, groupedStandardAttributeForm));