Java转Kotlin时多方法共用前置校验的Kotlin idiomatic实现方案
最优实现方案
核心思路是用inline高阶函数统一封装前置校验逻辑,消除重复模板代码,同时规避不安全的非空断言!!调用,完全符合Kotlin的空安全设计和惯用写法。
步骤1:封装统一校验执行函数
// 用inline修饰无额外性能开销,和手写判断逻辑性能一致 private inline fun withValidEndpoint(action: (endpoint: String) -> Unit) { val endpoint = mSettings?.endpoint if (endpoint == null) { // 完全对齐原有逻辑:调试模式下直接抛出参数异常 require(!isDebugMode) { "endpoint is not set !!!" } // 校验失败统一触发错误回调,无需每个业务方法重复写 callback.onError(ENDPOINT_UNINITIALIZED, "ERROR_END_POINT_NOT_SET") return } // 校验通过直接透传非空的endpoint给业务逻辑 action(endpoint) }
步骤2:业务方法直接调用封装函数
所有需要校验的doAction系列方法都可以简化为以下写法:
fun doAction_1() { withValidEndpoint { endpoint -> // 此处直接拿到经过校验的非空endpoint,无需额外判空 doSomething_1(endpoint) } } fun doAction_2() { withValidEndpoint { endpoint -> doSomething_2(endpoint) // 其他业务逻辑直接写即可 } }
方案优势
- 完全消除重复的校验模板代码,后续如果调整校验规则,只需要修改
withValidEndpoint一处即可 - 规避了原写法中
mSettings!!.endpoint的空指针风险:该实现中直接在校验时将endpoint赋值给局部变量,即使多线程场景下mSettings被置空也不会影响后续逻辑 - 完全对齐原有业务逻辑,调试模式抛异常、非调试模式返回错误回调的逻辑都得到完整保留
内容的提问来源于stack exchange,提问作者lannyf
相关产品推荐
相关产品推荐

