使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)上

简介: 使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)

依赖注入为何物


  既然你已经点进来了,想必已经知道什么是依赖注入了吧,什么?!你还不知道什么是依赖注入吗,那你更要继续往下读了。

首先,来看看依赖注入的定义:

依赖注入就是参数传递

image.png

  噢噢,我的老伙计,希望你并没有因为这个简单的定义而直接离开本文,我当然知道参数传递是每一位入门级程序员都掌握的基本能力,但为什么要用其他工具来完成这个参数传递呢,因为随着项目的膨胀,项目组件的不断扩大,组件之间的耦合关系也会愈发复杂,我们用一个实际例子来看看


项目膨胀导致的参数传递问题


  假设我有一个这样的场景,我需要构造一个车子,车子又有其他零件,零件又有子零件。


/**
 * 车子
 */
class Car(
    private val steeringWheel: SteeringWheel,
    private val wheel: Wheel
)
/**
 * 方向盘
 */
class SteeringWheel(private val color:String)
/**
 * 轮子
 */
class Wheel(private val steel: Steel)
/**
 * 钢圈
 */
class Steel(private val circle:Int)
  那么我要如何构造这个车子呢,代码如下(多个场景表示在项目中存在多处需要构造Car的地方):
kotlin
复制代码
//模拟场景1
fun test1(){
    Car(SteeringWheel("红色"), Wheel(Steel(30)))
}
//模拟场景2
fun test2(){
    Car(SteeringWheel("蓝色"), Wheel(Steel(40)))
}
//模拟场景3
fun test3(){
    Car(SteeringWheel("黑色"), Wheel(Steel(50)))
}

  All right!所有的一切都没问题,项目正常上线,然后某天项目经理跟你说:嘿,这位码农,麻烦给钢圈加个花边吧。你按捺住内心想打人的冲动,然后打开AS,给钢圈加一个属性,不出意外的是,项目出现了一大堆报错,原来是因为汽车包含了轮子,轮子包含了花边,于是所有构造汽车的代码都报错了,于是你修改了代码,变成了如下:


/**
 * 钢圈
 */
class Steel(private val circle:Int,private val lace:String)
//模拟场景1
fun test1(){
    Car(SteeringWheel("红色"), Wheel(Steel(30,"花边1")))
}
//模拟场景2
fun test2(){
    Car(SteeringWheel("蓝色"), Wheel(Steel(40,"花边2")))
}
//模拟场景3
fun test3(){
    Car(SteeringWheel("黑色"), Wheel(Steel(50,"花边3")))
}

  加班到12点的你终于确认了所有的代码都被修改,提交测试上线,但是回到床位后的你依然战战兢兢的思考着今天的问题,万一下一次项目经理又要你添加其他属性呢,一想到又要加班熬夜你迅速起身疯狂百度,于是你了解到了工厂模式

  于是你又起床新增了一个Car的工厂接口


interface CarFactory {
    fun build():Car
}
object CarAFactory:CarFactory{
    override fun build(): Car {
        return Car(SteeringWheel("红色"), Wheel(Steel(30,"花边1")))
    }
}
object CarBFactory:CarFactory{
    override fun build(): Car {
        return Car(SteeringWheel("蓝色"), Wheel(Steel(40,"花边2")))
    }
}
object CarCFactory:CarFactory{
    override fun build(): Car {
        return Car(SteeringWheel("黑色"), Wheel(Steel(50,"花边3")))
    }
}
//模拟场景1
fun test1(){
    CarAFactory.build()
}
//模拟场景2
fun test2(){
    CarBFactory.build()
}
//模拟场景3
fun test3(){
    CarCFactory.build()
}

  情况看起来好了很多,调用端已经没有具体的构造代码了,一切的构造都交给了工厂类,但是一旦这些类的属性膨胀起来后,会出现许许多多的工厂类,甚至工厂类本身都会出现属性配置,调用端的代码依然需要手动去修改,也许你进一步学习了抽象工厂,但是这些手段总给你一种感觉:面多了加水,水多了加面。此时的你迫切希望有一种更加解耦,更加无侵入性的手段帮你去实现对象的构建。

image.png

  因此,假设有一个容器,他内部定义了如何构建各个零部件的构建方法,我们只需要告诉容器我需要什么,容器就会自动返回成品,因此我们也不需要手动去实现工厂类,那该多好?

   因此,我隆重推荐谷歌Jetpack里面的组件------Hilt




相关文章
|
3月前
|
XML API Android开发
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
69 4
|
Java 数据库 Android开发
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(三)
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(三)
150 0
|
Android开发
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(四)
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(四)
164 0
|
Android开发 容器
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)下
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)
86 0
|
Android开发 容器
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)上
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)
100 0
|
Android开发 容器
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)下
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)
128 0
|
缓存 API 调度
Android OkHttp+Retrofit+Rxjava+Hilt实现网络请求框架
🔥 介绍 本文通过OkHttp+Retrofit+Rxjava+Hilt实现一个网络请求框。
714 0
Android OkHttp+Retrofit+Rxjava+Hilt实现网络请求框架
|
测试技术 数据库 Android开发
Android Jetpack 浅析Hilt依赖注入
首先,某个类的成员变量称为依赖,如若此变量想要实例化引用其类的方法,可以通过构造函数传参或者通过某个方法获取对象,此等通过外部方法获取对象实例的称为依赖注入;而依赖注入又可以简单分为`手动注入`和`自动注入`两种方式;`Hilt`就是基于Dagger进行`场景化优化`的一个依赖注入库,Hilt是Google专门为Android平台打造的一个依赖注入库,在使用上极大程度进行啦简化(与dagger相比)
379 1
|
Android开发
android hilt使用详解
android hilt使用详解
715 0