为何OkHttp缓存拦截器使用非空断言(!!)而非安全调用运算符(?.)
为什么OkHttp缓存拦截器用非空断言(
!!)而非安全调用(?.)? 先看这段代码的逻辑:当networkRequest == null时,说明当前请求完全可以用缓存响应,不需要发起网络请求。这里用!!而非?.,核心原因有这几点:
内部逻辑的确定性保证
OkHttp的缓存拦截器内部,只有当确认缓存存在且完全可用(比如缓存未过期、符合缓存策略)时,才会把networkRequest设为null。也就是说,走到这个分支时,cacheResponse必然是已经存在的有效值,不存在为空的可能。用!!是开发团队对自身内部逻辑的自信,明确表达“这里不可能为空”的语义。快速暴露底层bug
退一万步说,如果真的出现cacheResponse为空的情况,这绝对是OkHttp内部逻辑的bug,而非业务层的问题。此时用!!直接崩溃,能第一时间让开发者发现底层逻辑的错误;如果换成?.,会得到一个null的Builder,后续调用build()要么抛出空指针,要么返回null,反而会在业务层引发更隐蔽、更难排查的问题,不如直接崩溃来得直接。代码可读性更强
!!比?.的语义更明确:它告诉后续维护者,这里的非空是有前置逻辑保证的,不是可能为空的模糊场景。如果用?.,反而会让维护者疑惑“这里是不是有可能为空?是不是漏了什么判断?”,增加理解成本。
所以这里用!!是权衡后的合理选择,既符合内部逻辑的确定性,又能在异常情况快速暴露问题,同时保证代码语义清晰。
内容的提问来源于stack exchange,提问作者Kartik Bindal
相关产品推荐
相关产品推荐

