Java中多if-else条件的优化

Java中多if-else条件的优化,java,if-statement,Java,If Statement,我有一个RESTAPI,它将根据特定的搜索条件提供搜索结果。 用户可以使用部门Id、用户Id和加入日期进行搜索。 所以在这里,用户可以搜索7种不同的组合 仅使用部门Id搜索 仅使用用户Id进行搜索 仅使用加入日期进行搜索 使用部门Id和用户Id进行搜索 使用用户Id和加入日期进行搜索 使用部门Id和加入日期进行搜索 搜索将包含所有3个条件(部门Id、用户Id和加入日期) 根据我们应用程序的当前设计,对于每个标准,我必须以不同的顺序调用不同的服务以获取信息 例如:我们有一个包含用户详细信息的现有用

我有一个RESTAPI,它将根据特定的搜索条件提供搜索结果。 用户可以使用部门Id、用户Id和加入日期进行搜索。 所以在这里,用户可以搜索7种不同的组合

  • 仅使用部门Id搜索
  • 仅使用用户Id进行搜索
  • 仅使用加入日期进行搜索
  • 使用部门Id和用户Id进行搜索
  • 使用用户Id和加入日期进行搜索
  • 使用部门Id和加入日期进行搜索
  • 搜索将包含所有3个条件(部门Id、用户Id和加入日期)
  • 根据我们应用程序的当前设计,对于每个标准,我必须以不同的顺序调用不同的服务以获取信息

    例如:我们有一个包含用户详细信息的现有用户服务,一个包含详细信息的部门服务。所以,若用户只搜索用户ID,我将直接转到UserService。如果用户使用部门ID和用户进行搜索,我将首先查询部门服务,然后查询用户服务

    我目前的代码是:

    if(Util.hasOnlyUserId(searchCriteria)) {
            searchResponse = searchWithUserId(searchRequest);
        } else if(Util.hasOnlyJoinedDate(searchCriteria)) {
            searchResponse = searchWithDate(searchRequest);
        } else if (Util.hasOnlyDeptID(searchCriteria)) {
            searchResponse = searchWithDeptId(searchRequest);
        } else if (Util.hasUserIdAndDeptId(searchCriteria)) {
            searchResponse = searchWithUserIdAndDeptId(searchRequest);
        } else if (Util.hasUserIdAndDate(searchCriteria)){
            searchResponse = searchWithUserIdAndDate(searchRequest);
        } else if (Util.hasDeptIdAndDate(searchCriteria)) {
            searchResponse = searchWithDeptIdAndDate(searchRequest);
        } else if (Util.hasAllCriteria(searchCriteria)) {
            searchResponse = searchWithAllCriteria(searchRequest);
        }
    
    这里,searchCriteria是我的请求对象(POJO),它将这些搜索元素作为私有成员

    这里的searchResponse是一种searchResponse对象,它是API的实际响应,它包含用户的详细信息,如姓名、id、职位、LastSalaryDrawed、通勤类型、MaritalStatus和上次升级日期

    我一直在尝试优化这个多重if-else条件,换句话说,避免出现这种多重条件。 我试着将它们分开,并将它们放入不同的方法中。但这并不能让我满意,而且它似乎处于不可优化的状态

    任何关于我如何做这件事的想法都将不胜感激

    编辑:我们正在使用JPA和MySQL交互。 这里的问题是,我不会直接从数据库获取信息。因此,构建动态查询可能不起作用。 这些信息需要从多个微服务中获取,这些微服务将调用它们的本地数据库,并将所需的信息作为响应发送。
    我希望这是有意义的。

    代码可以优化。

    这里可以使用各种模式,您必须根据搜索代码的外观选择一种模式。一些人已经提到了战略和责任链模式。另一个你可以看的是模式。它允许您拥有仅在需要时指定的可选零件,以构建最终对象

    因此,您可以有一个
    SearchBuilder
    类,在添加更多筛选条件时更新有关搜索的信息。它可以有像
    setUserId(…)
    setDeptId(…)
    等方法

    例如:如果搜索被转换为
    PreparedStatement
    中的普通SQL查询,则每当设置一个筛选字段时,构建器都会存储它们(它们将以
    null
    开头)。因此,如果您在构建器中调用了setUserId()和setDeptId(),那么它们在构建器中就不会是
    null
    ,并且您会生成一个带有字符串的查询(为您要筛选的每个额外字段追加
    和…
    ):
    从id=”的用户中选择*?部门id=?


    SearchBuilder
    可以提供一个
    build()
    方法,然后返回一个
    Search
    对象,该对象携带查询,甚至可能提供执行查询的方法,或者您需要执行的任何操作

    您可以将代码移动到执行条件的位置,并动态生成查询:

    public SearchResponse searchWithCriteria(Criteria searchCriteria) {
        StringBuilder query = new StringBuilder("SELECT * FROM ... WHERE ...");
        if (util.hasUserId(searchCriteria))
            query.append(" AND userId = :userId");
        if (util.hasJoinedDate(searchCriteria))
            query.append(" AND joinedDate = :joinedDate");
        ...
        PreparedStatement stmt = connection.prepareStatement(query);
        if (util.hasUserId(searchCriteria))
            stmt.setString("userId", searchCriteria.getUserId());
        if (util.hasJoinedDate(searchCriteria))
            stmt.setDate("joinedDate", searchCriteria.getJoinedDate());
        ...
        ResultSet res = stmt.executeQuery();
        ...
    }
    

    这类问题应在会议上提出。因为它是关于运行代码的优化,所以您可以查看责任链设计模式:什么是
    searchResponse
    ?假设响应为
    用户类型,我将提供单一服务,该服务将根据提供的条件通过单一选择构建来处理所有案例。@matoni我已编辑了该问题,并添加了搜索响应的解释。我投票将该问题作为离题问题结束,因为如何改进工作代码的问题属于请提供答案,而不是链接到外部资源(可能会随着时间的推移而流失)这是一个很好的解决方案。但我已经编辑了这个问题,并解释了为什么我不能采用这种方法。