zoukankan      html  css  js  c++  java
  • okhttp中的Builder模式

    代码

    我们以Request类为例,以下是部分代码:

    public final class Request {
      private final HttpUrl url;
      private final String method;
      private final Headers headers;
      private final RequestBody body;
      private final Object tag;
    
      private volatile CacheControl cacheControl; // Lazily initialized.
    
      private Request(Builder builder) {
        this.url = builder.url;
        this.method = builder.method;
        this.headers = builder.headers.build();
        this.body = builder.body;
        this.tag = builder.tag != null ? builder.tag : this;
      }
    
      public static class Builder {
        private HttpUrl url;
        private String method;
        private Headers.Builder headers;
        private RequestBody body;
        private Object tag;
    
        public Builder() {
          this.method = "GET";
          this.headers = new Headers.Builder();
        }
    
        public Builder url(String url) {
          if (url == null) throw new NullPointerException("url == null");
    
          // Silently replace websocket URLs with HTTP URLs.
          if (url.regionMatches(true, 0, "ws:", 0, 3)) {
            url = "http:" + url.substring(3);
          } else if (url.regionMatches(true, 0, "wss:", 0, 4)) {
            url = "https:" + url.substring(4);
          }
    
          HttpUrl parsed = HttpUrl.parse(url);
          if (parsed == null) throw new IllegalArgumentException("unexpected url: " + url);
          return url(parsed);
        }
    
        public Builder get() {
          return method("GET", null);
        }
    
        public Builder method(String method, RequestBody body) {
          if (method == null) throw new NullPointerException("method == null");
          if (method.length() == 0) throw new IllegalArgumentException("method.length() == 0");
          if (body != null && !HttpMethod.permitsRequestBody(method)) {
            throw new IllegalArgumentException("method " + method + " must not have a request body.");
          }
          if (body == null && HttpMethod.requiresRequestBody(method)) {
            throw new IllegalArgumentException("method " + method + " must have a request body.");
          }
          this.method = method;
          this.body = body;
          return this;
        }
    
        public Request build() {
          if (url == null) throw new IllegalStateException("url == null");
          return new Request(this);
        }
      }
    }
    

    source:https://github.com/square/okhttp/blob/parent-3.3.1/okhttp/src/main/java/okhttp3/Request.java

    说明

    Request类两个明显特点:

    1. 构造函数是私有的,只能通过类的内部调用,我们看到是Build方法调用
    2. 有个静态的内部类Builder,构建Request实例只能通过Builder

    使用

    Request request = new Request.Builder()
                    .get()
                    .url("https:www.baidu.com")
                    .build();
    
  • 相关阅读:
    2.5.1 选择器中含有特殊符号的注意事项
    动手为王:由一条UPDATE语句引发的一波三折深入实践(含PPT)
    基于JSR-356实现的Tyrus WebSocket框架的消息传递机制初步了解
    基于JSR-356实现的Tyrus WebSocket框架的消息传递机制初步了解
    Pre-shared key
    Pre-shared key
    Pre-shared key
    Pre-shared key
    confluence+jira
    confluence+jira
  • 原文地址:https://www.cnblogs.com/talentzemin/p/15104062.html
Copyright © 2011-2022 走看看