Kotlin中直接调用Api()创建接口实例的写法是否合法?
结论
这个实现完全符合语法规则,是正确的写法,你看到的Api()看起来像直接实例化接口,本质是Kotlin语法糖和Retrofit动态代理特性结合的效果,并没有违反「接口无法直接实例化」的基础规则。
原理说明
- 首先是Kotlin运算符重载的作用:你定义的
Api接口里写了伴生对象,并且重载了operator fun invoke()方法,Kotlin中只要类/接口的伴生对象重载了invoke运算符,就可以直接用类名(参数)的格式调用这个方法,外观上和实例化类的写法完全一致,实际走的是伴生对象的方法调用逻辑,根本不是实例化接口本身。 - 其次是Retrofit的动态代理能力:伴生对象的
invoke方法里调用了Retrofit.create(Api::class.java),这是Retrofit的核心特性,它会在运行时通过动态代理技术自动生成你定义的Api接口的实现类实例,不需要开发者手动编写接口实现代码,生成的实例完全符合Api接口的类型定义,可以直接调用接口里声明的请求方法。
执行流程拆解
你写的Api().userLogin(username,password)实际执行逻辑是:
- 调用
Api接口伴生对象的invoke()方法 invoke方法内部完成Retrofit实例的配置、构建- Retrofit通过动态代理生成
Api接口的实现类实例并返回 - 调用返回的代理实例的
userLogin方法,发起登录网络请求
这种封装方式是安卓MVVM开发中非常常见的Retrofit封装技巧,简化了Api实例的创建调用逻辑。
内容的提问来源于stack exchange,提问作者Binod Basnet
相关产品推荐
相关产品推荐

