适用于 Android 初学者的 Dagger 2 - 简介

本文适合初学者了解Dagger2,一个用于Java和Android的依赖注入框架。文章详细介绍了依赖的概念,依赖为何会成为问题,以及依赖的多种类型,为后续学习Dagger2打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文翻译自 Dagger 2 for Android Beginners — Introduction,作者是 Hari Vignesh Jayapalan

目录

谁应该阅读?

系列目录

先决条件

什么是依赖?

为什么依赖不好?

依赖的类型

总结

下一步是什么?


Dagger 是一个完全静态的编译时依赖注入框架,适用于 Java 和 Android。 它是 Square  创建的早期版本的改编版,现在由 Google 维护。(资源)

谁应该阅读?

如果你是一个崭露头角的 Android 开发者,你直接开始使用 Android 并且平行学习 Java  - 这适合你。 或者,如果你是一个尝试学习 Dagger 2 并且你发现很难理解其他在线内容的人 - 别担心,我也曾有过一段艰难时期(我们有点特别,我们需要以不同的方式解释 )这绝对适合你。 如果您已经熟悉 DI 和 Dagger,那么您可以得到新的东西或更加清晰(或者听起来非常初级)。

系列目录

先决条件

我假设您熟悉 Java 编程语言OOP 原则Android 开发。

什么是依赖?

注意:为了解释以下概念,我使用了权力的游戏类比。如果您对此不熟悉,请将下面的类名 Targaryens 和 Dragons 替换为 A 和 B。而且,你当然应该开始看这个系列剧了:-P

理解依赖/耦合是使面向对象编程概念更清晰的第一步。 那么,什么是依赖? 例如,我们有一个名为 Targaryens 的类,在 Targaryens 类中使用另一个名为 Dragons 的类或接口 - 然后类 Targaryensdepends 依赖类或接口 Dragons。

Targaryens 依赖于 Dragons

这意味着没有 Dragons,Targaryens 就无法工作。 这也意味着 Targaryens 在哪,就需要 Dragons 在哪,即我们不重用 Dragons,就不能重用 Targaryens。 因此在这种情况下,Targaryens 被称为依赖者,而 Dragons 被称为依赖。 依赖者依赖于其依赖。

彼此使用的两个类被称为“耦合”。 类之间的耦合不是二元的 - 它是“紧”(强)或'松'(弱)的。 这些依赖总是方向性的,即 Targaryens 依赖于 Dragons,但 Dragons 可能不依赖于 Targaryens。

class Targaryens {
        public Targaryens() {
                // 每次我们使用 Targaryens,我们都要创建 Dragons 实例
                Dragons dragons = new Dragons();
                dragons.callForWar();
        }
}

解释依赖

为什么依赖不好?

当类中存在许多依赖时,会导致严重的依赖问题 - 由于以下原因这些问题很糟糕

  • 硬依赖降低了可重用性
  • 硬依赖使测试变得困难
  • 当项目扩展时,硬依赖会妨碍代码的可维护性

#可重用性

当类和方法松散或不耦合或不依赖于许多东西时,它的可重用性增加。 可重用性是面向对象编程的核心要求之一。

#测试

对于测试,您将模拟某些对象。 但是如果方法或类中存在太多的依赖关系,则很难进行测试。 如果 java 类通过 new 运算符创建另一个类的实例,则不能独立于该类使用和测试它。

#可维护性

当您的代码无法正确测试且组件不可重用且项目继续增长时,维护将非常困难。 可维护性包括许多其他因素,但只要团队中的新开发人员了解系统并使开发人员的工作变得舒适,您就可以开始了。

依赖的类型

依赖有很多类型,常见的是

  • 类依赖
  • 接口依赖
  • 方法/变量(field)依赖
  • 直接和间接依赖

还有更多的依赖,这里并没有包含它们。

#类依赖

类依赖是对类的依赖。     我们之前已经看过类依赖示例,构造函数方法 Targaryens 依赖于或需要 Dragons 类来调用 callForWar( )。

#接口依赖

接口依赖是接口的依赖。 executePlan 方法将接口 WarStrategy 作为依赖。WarDependency 将由所有家族(Targaryens,Starks,Lannisters等)实现。

public Result executePlan(WarStrategy strategy) {
  //WarStrategy 被所有家族所实现
}

#方法或变量依赖

方法或变量依赖是对对象的具体方法或变量的依赖。下面的方法接收一个类对象,方法 getKing( ) 是方法依赖,它不能用方法声明来标识。

public String extractName(HouseClass house) {
  return house.getKing();
  //得到家族的国王
}

#直接或间接依赖

让我用另一个例子来解释这个。 Targaryens 类依赖于 Starks 类征服王位。 但是 Starks 依赖于北方的其他王国,Mormont 类 - 所以现在, Targaryens 间接地依赖于 Mormont 并且直接依赖于 Starks

总结

如果 java 类通过 new 运算符创建另一个类的实例,则它不能独立于该类使用和测试,并称它为依赖项。

依赖很糟糕,因为它会阻止整个项目中的代码可重用性,并且使测试工作变得困难 - 因此它也会妨碍代码维护。

依赖有很多类型,如类,接口,方法或变量,直接和间接等。

下一步是什么?

在下一站,我们将讨论这个硬依赖问题的解决方案 - 是的,你是对的:依赖注入。 我们将通过一个真实的场景,识别硬依赖并分析它。

适用于 Android 初学者的 Dagger 2  -  DI 第一部分
这个故事是该系列的第二部分,适用于 Android 初学者的 Dagger 2。 如果您没有阅读上一篇,那么您... medium.com

另外,看看我的其他故事

推荐阅读

学习实现您的第一个 Android UI 库 - 第1部分
创建 UI 库 medium.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值