版权声明:有些文章写的很随意,那是仅作为个人记录的文章,建议直接关掉,多看一秒亏一秒 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形式。
换个角度想想,它等价于我们直接实例一个匿名抽象类,这里是把这个实例匿名抽象类的操作封装了。这样做的好处是省掉实例匿名抽象类的工作,子类也可以方便创建这样一个对象,写出同样的工厂,这个抽象类也告诉了我们这个元素需要的属性是什么。