Hilt模块使用object与class定义的区别是什么?
Hilt中object Module与class Module的区别
先纠正下你代码里的注解大小写问题——Hilt的官方注解都是大写开头的,比如@InstallIn、@Singleton、@Provides,你示例里的小写写法实际运行会报错,应该是输入时的笔误。
回到你的问题,object NetworkModule和class NetworkModule在Hilt中的核心区别如下:
1. 实例特性与创建逻辑
- object模块:Kotlin的
object本身就是饿汉式全局单例,整个应用生命周期内只会存在一个NetworkModule实例,Hilt直接复用这个单例来调用@Provides方法,不需要额外实例化操作。 - class模块:普通
class是可实例化的类,Hilt会根据模块@InstallIn绑定的组件来管理模块实例的生命周期:- 如果绑定到
SingletonComponent,Hilt会为该模块创建一个单例实例; - 如果绑定到
ActivityComponent这类组件,每个组件实例(比如每个Activity)都会对应一个模块实例。
- 如果绑定到
2. 扩展性差异
- object模块:无法定义构造函数,也不能被继承,扩展性极差。如果你的模块需要依赖其他对象(比如传入环境配置参数),或者需要根据不同场景做定制化,
object完全满足不了需求。 - class模块:支持构造函数注入(模块的构造函数可以注入其他依赖),也允许被继承,适合复杂场景。比如要区分开发/生产环境提供不同的Retrofit baseUrl,就可以通过class模块的构造参数或者子类来实现。
3. 初始化时机与性能
- object模块:Kotlin的
object会在第一次被访问时立即初始化(饿汉式),如果模块内部有耗时操作,可能会拖慢应用启动速度。 - class模块:Hilt会在真正需要使用模块的
@Provides方法时才创建实例,属于延迟初始化,能避免不必要的性能开销。
为什么你替换后能正常运行?
因为你的模块是无状态的——只是用来提供Retrofit这类不依赖模块内部状态的实例,不管用object还是class,Hilt都能正确调用@Provides方法生成依赖。这种场景下两者的运行效果完全一致。
内容的提问来源于stack exchange,提问作者ntos
相关产品推荐
相关产品推荐

