成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android注解三大框架Dagger、Hilt 和 Koin 有何不同?

移動開發(fā) Android
在本文中,我不會告訴您應(yīng)該選擇哪個庫。相反,我想向您展示它們的本質(zhì)區(qū)別以及這些差異對您的應(yīng)用造成的影響。

 Dagger 和 Koin 無疑是 Android 中最流行的兩個依賴注入框架。這兩個庫具有相同的用途,而且看起來非常相似,但它們在底層的工作方式卻非常不同。

那么 Hilt 是什么呢?Hilt 是一個內(nèi)部使用 Dagger 的庫,只是簡化了它的用法,因此我在這里所說的有關(guān) Dagger 的內(nèi)容也適用于 Hilt。在本文中,我不會告訴您應(yīng)該選擇哪個庫。相反,我想向您展示它們的本質(zhì)區(qū)別以及這些差異對您的應(yīng)用造成的影響。

Dagger

如果我們希望 Dagger 提供某個類的實例,我們要做的就是在構(gòu)造函數(shù)中添加 @Inject 注解。

添加這個注解后,Dagger 會在構(gòu)建時為這個類生成一個 Factory。在該用例下,由于它的類名是 CompositeAdapter, 它會生成一個名為 CompositeAdapter**_**Factory的類。

此類包含創(chuàng)建 CompositeAdapter 類的實例所需的所有信息。

如你所看到該工廠類實現(xiàn)了 get() 并返回了一個新的 CompositeAdapter 實例。這實際上是此類實現(xiàn)的 Provider <T> 接口中指定的方法。其他類可以使用 Provider<T> 接口來獲取一個類的實例。

如果我們用 Hilt 代替 Dagger 呢?

在這個例子中,沒有任何區(qū)別。Hilt 是一個內(nèi)部使用 Dagger 的庫,我向你展示的類是由 Dagger 生成的。如果您使用 Hilt,它確實為我們生成了一些額外的類,這些類簡化了 Dagger 的使用,并減少了我們需要編寫的樣板代碼的數(shù)量。但核心部分保持不變。

Koin

Koin 與 Dagger 以及 Hilt 相比,管理依賴項的方法完全不同。要在 Koin 中注冊依賴項,我們不會使用任何注解,因為Koin不會生成任何代碼。相反,我們必須為模塊提供工廠,這些模塊將用于創(chuàng)建項目中所需的每個類的實例。

Koin 將這些工廠類的引用添加到 InstancesRegistry 類中,該類包含對我們編寫的所有工廠的引用。

該 map 中的 key 是類的全名或使用命名參數(shù)時提供的名稱。對應(yīng)的值是我們編寫的工廠,將用于創(chuàng)建類的實例。

要獲得依賴關(guān)系,我們需要調(diào)用 get() (比如在一個工廠類中) 或者通過在 activities 或 fragments 中調(diào)用 inject() 委托屬性 ,從而懶加載 get()。get()方法將查找為給定類型的類注冊工廠,并將其注入其中。

有什么影響?

Dagger 生成代碼來提供依賴,而 Koin 不生成代碼,這實際上帶來了一些影響。

1. 錯誤處理

因為Dagger 是一個編譯時依賴注入框架,如果我們忘記提供某些依賴,我們幾乎會立即知道我們的錯誤,因為我們的項目將構(gòu)建失敗。

例如,如果我們忘記向構(gòu)造函數(shù)的 CompositeAdapter 中添加 @Inject 注解,并嘗試將其注入 fragment 中,則構(gòu)建將失敗,并顯示適當(dāng)?shù)腻e誤,確切地告訴我們出了什么問題。

在 Koin 中的情況有所不同,因為它不會生成任何代碼。如果我們忘記為 CompositeAdapter 類添加工廠,應(yīng)用將會成功構(gòu)建,但是會拋出 RuntimeException 一旦我們請求獲取這個類的實例。它可能會在應(yīng)用啟動時發(fā)生,因此我們可能會立即注意到它,但也可能稍后在其他屏幕上或當(dāng)用戶執(zhí)行某些特定操作時發(fā)生。

2. 對構(gòu)建時間的影響

Koin 不生成任何代碼的優(yōu)點是:它對我們的構(gòu)建時間的影響要小得多。Dagger 需要使用注解處理器來掃描代碼并生成適當(dāng)?shù)念悺_@可能需要一些時間,可能會減慢我們的構(gòu)建。

3. 對運行時性能的影響

從另一方面來說,因為 Koin 在運行時解析依賴項,所以它的運行時性能稍差一些。

到底相差多少呢?為了估算性能差異我們可以使用該庫,其中 Rafa Vázquez 基于不同的設(shè)備上測量并比較了這兩個庫。測試數(shù)據(jù)的編寫方式可以模擬多個級別的傳遞依賴關(guān)系,因此它不僅僅是具有 4 個類的虛擬應(yīng)用程序。

如您所見,Dagger 對啟動性能幾乎沒有影響。另一方面,在 Koin 中,我們可以看到它花費了很多時間。在 Dagger 中注入依賴也比在 Koin 中快一些。

總結(jié)

正如我在本文開始時所說的,我這里的目標(biāo)不是告訴您要使用哪個庫。我在兩個不同的大項目中都使用了 Koin 和 Dagger。老實說,我認(rèn)為選擇 Dagger 還是 Koin 并不重要,重要的是能夠讓你編寫干凈、簡單且易于單元測試的代碼。我認(rèn)為所有的庫:Koin,Dagger 和 Hilt 都達(dá)到了這個目的。

所有這些庫都有自己的優(yōu)勢,我希望了解它們在底層是如何工作的,能夠幫助您自己決定哪種庫最適合您的應(yīng)用。 

 

責(zé)任編輯:龐桂玉 來源: 互聯(lián)網(wǎng)程序員
相關(guān)推薦

2020-08-18 16:10:44

ManjaroArch LinuxLinux

2018-05-31 08:17:53

RAIDNAS重疊

2010-09-10 10:20:51

DIVSpan

2021-12-02 14:10:34

ChromeChromium瀏覽器

2011-12-21 09:01:28

云計算編程開發(fā)

2023-09-01 07:38:45

ArrayListArrayst實線類

2015-10-22 10:23:34

程序員工程師不同

2014-07-08 14:05:48

DaggerAndroid依賴

2020-09-25 18:10:06

Python 開發(fā)編程語言

2024-01-23 09:51:11

編程工具

2023-12-12 11:45:54

云服務(wù)數(shù)據(jù)科學(xué)家云計算

2016-12-22 16:21:37

Windows微軟盜版系統(tǒng)

2017-05-31 14:52:53

虛擬機(jī)Docker容器

2021-07-02 15:28:55

LTE5G網(wǎng)絡(luò)

2016-05-06 15:59:41

2017-01-13 16:26:56

開發(fā)

2019-05-06 07:53:13

AnthosAzure Stack容器

2018-01-05 09:43:54

ROMRAM存儲

2024-08-14 16:45:04

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91在线视频免费观看 | 欧美在线观看黄色 | 国产免费黄网 | 日本人做爰大片免费观看一老师 | 草草草影院 | 亚洲国产二区 | 久久1区 | 久久亚洲精品视频 | 亚洲欧美一区二区三区在线 | 欧美精品在线免费 | 欧美二区在线 | 欧美成人精品 | 久久这里只有 | 欧美日韩一区在线观看 | 亚洲va国产日韩欧美精品色婷婷 | 国产成人自拍一区 | 国产视频在线一区二区 | 性做久久久久久免费观看欧美 | 最新黄色在线观看 | 国产99久久精品一区二区永久免费 | 精品一区二区三区四区 | 欧美日韩国产精品一区 | 日本久久久久久 | 91成人免费电影 | 欧美a免费 | 久久久久国产一区二区三区四区 | 少妇精品亚洲一区二区成人 | a级片在线| 午夜二区 | 中文久久 | 久久精品成人 | www.国产| 天天看天天爽 | 精品国产乱码久久久久久蜜退臀 | 成人在线网| 亚洲一区二区三区视频免费观看 | 欧美人成在线视频 | 亚洲综合天堂 | 久久久久亚洲精品中文字幕 | 免费在线观看成人av | 性做久久久久久免费观看欧美 |