Java中OkHttpClient初始化应设置为static final还是仅final?
OkHttp客户端实例修饰符选择与使用规范解答
核心结论
OkHttpClient本身是线程安全的,官方设计就是支持全局单例复用,复用同一个实例可以共享内部的连接池、线程池、响应缓存、DNS解析结果等资源,大幅降低重复请求的开销,避免资源浪费。
针对你的场景的具体问题解答
- 类A中的
OkHttpClient字段推荐使用static final修饰
你当前的类A没有其他实例状态,用static final修饰后,所有A的实例都会共用同一个OkHttpClient对象,完全符合性能最优的要求。官方示例仅使用final修饰并不代表不能加static,多数官方示例的场景是将OkHttpClient作为单例组件的实例属性,组件本身全局只有一个的前提下,实例final和static final的效果是一致的。 - 不推荐仅用
private final而不加static的写法
如果去掉static,每new一个A的实例就会创建一个新的OkHttpClient,你当前代码中B和C各持有一个A的静态实例,就会产生2个独立的OkHttpClient,如果后续更多地方创建A的实例,会产生更多冗余的客户端对象,无谓消耗内存和连接资源。 - 当前用法在多线程场景下完全规范
OkHttpClient的所有公开方法都是线程安全的,多线程同时调用makeRequest方法不会产生并发问题,你代码中使用try-with-resources自动关闭Response的写法也符合资源释放的要求,不会出现连接泄漏。 - 可以将类A改造为全静态工具类
因为类A没有任何实例字段,你可以将A的构造方法私有化,把makeRequest改为静态方法,后续B和C直接调用A.makeRequest(...)即可,不需要再持有A的实例,代码会更简洁。
内容的提问来源于stack exchange,提问作者Arzybek
相关产品推荐
相关产品推荐

