You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:24:57