位置:首页 > Kotlin > 工厂模式迁移到Hilt的实现方法与最佳实践

工厂模式迁移到Hilt的实现方法与最佳实践

时间:2026-08-15  |  作者:星际追番人  |  阅读:0

工厂模式 → Hilt

老写法(Ja va — Factory/手动容器)

// ViewModel Factory
public class ItemViewModelFactory implements ViewModelProvider.Factory {
    private final ItemRepository repository;
    public ItemViewModelFactory(ItemRepository repository) {
        this.repository = repository;
    }
    @Override
    public extends ViewModel> T create(Class modelClass) {
        if (modelClass.isAssignableFrom(ItemViewModel.class)) {
            return (T) new ItemViewModel(repository);
        }
        throw new IllegalArgumentException("Unknown ViewModel class");
    }
}

// 使用
ItemViewModelFactory factory = new ItemViewModelFactory(repository);
ItemViewModel vm = new ViewModelProvider(this, factory).get(ItemViewModel.class);

问题在哪里

核心问题是样板代码太多。

每多一个 ViewModel,通常就要多一个 Factory 类。十几个 ViewModel,往往就会对应十几个 Factory。

依赖链越长,Factory 里要传的依赖也越多。这样一来,维护成本会越来越高,代码也会更臃肿。

工厂模式 → Hilt
            <!----></a> <!---->

新写法(Hilt)

1. Application 配置

先在 Application 上添加 @HiltAndroidApp

@HiltAndroidApp
class App : Application()

2. 提供依赖

需要提供给外部使用的依赖,可以放在 Module 中:

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides @Singleton
    fun provideOkHttp(): OkHttpClient = OkHttpClient.Builder().build()

    @Provides @Singleton
    fun provideRetrofit(client: OkHttpClient): Retrofit =
        Retrofit.Builder().baseUrl("...").client(client).build()

    @Provides @Singleton
    fun provideApi(retrofit: Retrofit): ApiService =
        retrofit.create(ApiService::class.ja va)
}

3. 构造函数注入

自己的类可以直接使用构造函数注入,不需要写在 Module 里

class ItemRepository @Inject constructor(
    private val api: ApiService
)

4. 在 ViewModel 和 Activity 中使用

ViewModel 和页面层的写法也会更直接:

@HiltViewModel
class ItemViewModel @Inject constructor(
    private val api: ApiService,
    private val repository: ItemRepository
) : ViewModel()

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    private val viewModel: ItemViewModel by viewModels()
}

一句话注意

用了 Hilt 之后,ViewModel Factory 这部分会自动生成,通常不必再手动去写。

只要配上 @HiltViewModel@Inject constructor,基本就齐了。

至于依赖怎么来,也很直接:在类的构造函数里声明清楚,剩下的依赖树解析工作,Hilt 会自动接过去。

补充理解

Hilt 是构建在 Dagger 之上的,所有依赖注入代码都会在编译期生成。

所以在性能表现上,通常会比依赖运行时反射的方案更占优势,比如 Koin。

不过另一面也很现实:Hilt 的编译速度往往比 Koin 慢一些。

如果项目体量不大,或者本身就不太喜欢注解处理器,那么用 Koin 来替代,也是完全说得通的选择。


Ja va Android 老项目迁移系列,持续更新中。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多