工厂模式 → Hilt

工厂模式 → Hilt

老写法(Java --- Factory/手动容器)

java 复制代码
// ViewModel Factory
public class ItemViewModelFactory implements ViewModelProvider.Factory {
    private final ItemRepository repository;
    public ItemViewModelFactory(ItemRepository repository) {
        this.repository = repository;
    }
    @Override
    public <T extends ViewModel> T create(Class<T> 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)

Application:

kotlin 复制代码
@HiltAndroidApp
class App : Application()

提供依赖:

kotlin 复制代码
@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.java)
}

自己的类用构造函数注入(不需要写在 Module 里):

kotlin 复制代码
class ItemRepository @Inject constructor(
    private val api: ApiService
)

使用:

kotlin 复制代码
@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 替代。


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

相关推荐
wangchunyu1148 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck8 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir8 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人9 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
警醒与鞭策9 小时前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
2501_944521599 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
南归北隐11 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾11 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
ai大模型-探索者11 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯11 小时前
啊啊啊啊啊
java·服务器·数据库