有 Java 编程相关的问题?

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

java如何避免if

我有一个Request对象,其字段Request_类型和其他字段的数量。请求类型可以是“additionRequest”、“deletionRequest”、“informationRequest”。 根据请求类型,对请求对象中的其他字段进行不同的处理

我头脑简单的方法是

if additionRequest
algorithm1
else if deletionRequest
algorithm2
else if deletionRequest
algorithm3
end

我如何避免这些if语句并仍然应用正确的算法


共 (5) 个答案

  1. # 1 楼答案

    如果希望避免使用条件语句,则可以利用面向对象的功能,例如:

    Map<String, Function<Request, Result>> parsers = new HashMap<>();
    
    parsers.put("additionRequest", request -> {
      // parse and generate Result here
      return result;
    });
    
    Result result = parsers.get(request.request_type).apply(request);
    
  2. # 2 楼答案

    在我看来,也许一种命令模式可以在这里派上用场。如果您为这些命令创建了一个对象结构,并将要在对象中执行的算法封装起来,那么您可以构造特定的子对象,然后使用命令的“execute”方法调用算法。只需确保您使用的是多态引用:

    if additionRequest
      algorithm1
    else if deletionRequest
      algorithm2
    else if deletionRequest
      algorithm3
    end
    

    将成为

    void theRequestExecutor(Reqest req) {
        req.executeAlgorithm()
    }
    

    https://en.wikipedia.org/wiki/Command_pattern

  3. # 3 楼答案

    在这种情况下使用HashMap<RequestType, RequestHandler>。RequestHandler可以是一个接口,它将针对您想要处理的每种情况来实现

    希望这有帮助

  4. # 4 楼答案

    面向对象的解决方案总是将逻辑与数据结合起来。在这种情况下,在请求对象本身中包含您希望请求执行的任何操作,而不是(大概)传递纯数据

    差不多

    public interface Request {
        Response apply();
    }
    

    其他任何事情,比如创建函数映射、创建一个薄的抽象层或应用某种模式,都是一种变通方法。只有当第一种溶液不能应用时,这些方法才适用。如果Request对象不在您的控制之下,例如自动生成或第三方类,则可能会出现这种情况

  5. # 5 楼答案

    您可以创建RequestType ReturnType的key:String、value:Function的映射。根据请求的类型,它将调用相应的函数

    例如:

      Map<String, Function<RequestType, ResponseType> requestProcessors = new HashMap<>;
      requestProcessors.add("additionRequest", this::methodToHandleAddRequest);
      requestProcessors.add("deletionRequest", this::methodToHandleDeleteRequest);
    

    内部请求处理程序

     return this.requestProcessors.get(request.request_type).apply(request);
    

    注意:如果不同的响应不同,您可能需要创建响应接口。不同的响应类型将从响应接口继承