抽象类实例化的工厂

版权声明:有些文章写的很随意,那是仅作为个人记录的文章,建议直接关掉,多看一秒亏一秒 https://blog.csdn.net/qq_36523667/article/details/82941157

Okhttp源码中,有这样一段

public static RequestBody create(
    final @Nullable MediaType contentType, final ByteString content) {
  return new RequestBody() {
    @Override public @Nullable MediaType contentType() {
      return contentType;
    }

    @Override public long contentLength() throws IOException {
      return content.size();
    }

    @Override public void writeTo(BufferedSink sink) throws IOException {
      sink.write(content);
    }
  };
}

这是在RequestBody类中的一个方法,RequestBody是一个抽象类。

首先这是一个工厂,是最简洁的工厂,一个类提供一个静态方法,返回其实例。在源码中的应用有,比如线程池Executors.singleThreadPool等。

其次这里是返回了抽象类的实例。我们通常用工厂是新建一个直接子类,然后转成抽象类。而这里是直接实例化了抽象类,这就让我对于这段不寻常的代码充满了兴趣。

目前我对于其整个上下文理解得还不够深,大概明白的是:

我们不一定要用FormBody,也可以直接调用RequestBody.create。

FormBody的MediaBody比较特殊,是application/form形式。

换个角度想想,它等价于我们直接实例一个匿名抽象类,这里是把这个实例匿名抽象类的操作封装了。这样做的好处是省掉实例匿名抽象类的工作,子类也可以方便创建这样一个对象,写出同样的工厂,这个抽象类也告诉了我们这个元素需要的属性是什么。

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/82941157