Kotlin如何在companion object中重写接口?OpenAPI+Retrofit场景问题
实现代码示例
封装层实现
class ApiBook(private val retrofitService: RetrofitBooksApi) { companion object { // 全局单例,仅初始化一次 private val INSTANCE: ApiBook by lazy { val apiClient = ApiClient() val service = apiClient.createService(RetrofitBooksApi::class.java) ApiBook(service) } // 对外暴露的静态调用入口,方法名与生成接口完全一致 suspend fun getBooksList(/* 参数与生成接口保持一致 */): MyCustomResponse<List<Book>> { return INSTANCE.getBooksList(/* 透传所有参数 */) } } // 实际封装逻辑,包含错误、空值处理 suspend fun getBooksList(/* 参数与生成接口保持一致 */): MyCustomResponse<List<Book>> { return try { val originResult = retrofitService.getBooksList(/* 透传所有参数 */) // 可选:自定义数据校验逻辑 MyCustomResponse.Success(originResult) } catch (e: Exception) { // 自定义错误转换逻辑 MyCustomResponse.Error(code = e.code ?: -1, message = e.message ?: "未知错误") } } }
接口完整性校验单元测试
import org.junit.Test import kotlin.reflect.full.declaredFunctions class ApiBookTest { @Test fun `check all RetrofitBooksApi methods are implemented`() { val originMethodSignatures = RetrofitBooksApi::class.declaredFunctions .map { it.name to it.parameters.map { param -> param.type } } .toSet() val implMethodSignatures = ApiBook::class.declaredFunctions .map { it.name to it.parameters.map { param -> param.type } } .toSet() originMethodSignatures.forEach { signature -> assert(implMethodSignatures.contains(signature)) { "ApiBook 缺少实现生成接口的方法:${signature.first},请及时补充" } } } }
业务侧调用
// MainActivity 中调用方式不变 lifecycleScope.launch { val response = ApiBook.getBooksList() // 处理自定义响应 }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

