Spring Boot 什么是最好的方法来避免链if-else条件调用不同的类函数?

kq0g1dla  于 2023-05-28  发布在  Spring
关注(0)|答案(1)|浏览(108)

我正在编写一个GraphQL查询API,它将filter作为输入。基于过滤器,我需要调用不同的对象函数。
API函数签名

public GrantsConnection fetch(GrantFilter filter)

GrantFilter具有以下属性。

public class GrantFilter {
  private Boolean isPrimary;
  private String profileId;
  private String entityId;
}

过滤器可以是一个或两个或所有属性的组合。
我的方法

public GrantConnection(GrantFilter filter) {
  if(filter.getIsPrimary() != null
     && filter.getProfileId() == null
     && filter.getEntityId() == null) {
    // invoke a function
  } else if(filter.getIsPrimary() == null
     && filter.getProfileId() != null
     && filter.getEntityId() == null) {
     // invoke different function
  } else if(filter.getIsPrimary() == null
     && filter.getProfileId() == null
     && filter.getEntityId() != null
     // invoke 3rd function
  }
 // other combinations
}

从条件调用的所有函数都是实现相同接口的对象。Spring写这篇文章最好的方法是什么?

kmynzznz

kmynzznz1#

我将创建一个实现Predicate<GrantFilter>的自定义Filter

@RequiredArgsConstructor
class Filter implements Predicate<GrantFilter> {
    private final Predicate<Boolean> isPrimaryPredicate;
    private final Predicate<String> profileIdPredicate;
    private final Predicate<String> entityIdPredicate;

    @Override
    public boolean test(GrantFilter gf) {
        return isPrimaryPredicate.test(gf.getIsPrimary())
                && profileIdPredicate.test(gf.getProfileId())
                && entityIdPredicate.test(gf.getEntityId());
    }
}

现在,我将保留一个pairsFilter的集合,以及一个将GrantFilter转换为GrantConnection的函数(这将允许以声明的方式创建显示在何种情况下需要调用哪个函数):

List<Pair<Filter, Function<GrantFilter, GrantConnection>>> connectionsByFilter = List.of(
        Pair.of(
                new Filter(Objects::nonNull, Objects::isNull, Objects::isNull), this::firstFunction
        ),
        Pair.of(
                new Filter(Objects::isNull, Objects::nonNull, Objects::isNull), this::secondFunction
        ),
        Pair.of(
                new Filter(Objects::isNull, Objects::isNull, Objects::nonNull), this::thirdFunction
        )
);

PS:请随意重命名一些东西或使代码更简洁一点。

相关问题