在 Android 專案中使用 Hilt 實現建構子注入 (Constructor Injection)

更新於 發佈於 閱讀時間約 6 分鐘
raw-image
【Android Hilt 依賴注入完整教學】系列文章目錄:連結
Youtube 教學頻道:HKT線上教室

今天要跟大家分享的是如何在 Android 專案中使用 Hilt 框架來實現建構子注入(Constructor Injection)。

建構子注入是依賴注入中最推薦的注入方式,因為它:

  1. 確保物件在建立時就擁有所有必要的依賴
  2. 使依賴關係更加明確且容易追蹤
  3. 有助於單元測試的編寫
  4. 在編譯時就能發現潛在問題

讓我們一步一步來了解這個重要的概念。

前言

在上一篇文章中,我們討論了成員注入(Member Injection)或欄位注入(Field Injection)的實作方式。今天要更進一步,介紹另一種更優雅的注入方式:建構子注入。

補充:什麼是建構子(Constructor)?

建構子(Constructor)是一個特殊的方法,用於初始化類別的新實例。它具有以下特點:

  1. 命名規則:
    • 建構子的名稱必須與類別名稱相同
    • 在 Kotlin 中使用 constructor 關鍵字宣告
    • 可以有多個建構子(稱為多載)
  2. 執行時機:
    • 在物件被建立時自動執行
    • 負責初始化物件的狀態
    • 設定必要的屬性值
  3. 建構子的類型:
    • 主要建構子(Primary Constructor)
    • 次要建構子(Secondary Constructor)
    • 無參數建構子(Default Constructor)
  4. 在依賴注入中的重要性:
    • 是實現建構子注入的關鍵
    • 透過建構子參數明確表達依賴關係
    • 確保物件在建立時就擁有所需的所有依賴

建構子注入基礎

讓我們從一個簡單的例子開始:

class Product @Inject constructor(
private val alertSystem: AlertSystem
)

在這個例子中,我們使用 @Inject 標註建構子,這樣 Hilt 就知道如何建立 Product 物件。但是要注意,我們不能直接在建構子中建立 AlertSystem 的實例,而是要讓 Hilt 來處理這個依賴關係。

相依類別的設定

為了讓 Hilt 知道如何提供 AlertSystem,我們需要在 AlertSystem 類別中也加入 @Inject 標註:

class AlertSystem @Inject constructor() {
fun alert() {
println("Alerting...")
}
}

進階應用:Context 注入

在實際開發中,我們常常需要使用 Android 的 Context。以下示範如何在 Hilt 中注入 Context:

class AlertSystem @Inject constructor(
@ApplicationContext private val context: Context
) {
fun alert() {
val message = context.getString(R.string.hello_world)
println(message)
println("Alerting...")
}
}

注意事項:

  1. Context 注入的標註選擇:
    • 使用 @ApplicationContext 標註可以注入 Application Context:
      • 適用於需要應用程式級別 Context 的場景
      • Application Context 的生命週期與應用程式相同
      • 適合用於單例模式的服務或工具類別
    • 使用 @ActivityContext 注入 Activity Context:
      • 適用於需要 Activity 相關功能的場景
      • 例如:顯示 Dialog、啟動新的 Activity
      • 需要特別注意生命週期管理
  2. Context 的生命週期管理:
    • 避免在長壽命的物件中持有短壽命的 Context 引用
    • 常見的記憶體洩漏情況:
      • 在單例物件中儲存 Activity Context
      • 在背景執行緒中持有 Activity Context
      • 在靜態變數中保存 Context 引用
    • 建議的做法:
      • 優先使用 Application Context
      • 需要 Activity Context 時,確保其生命週期不會超過 Activity
      • 使用 WeakReference 來持有 Context 引用
  3. 最佳實踐建議:
    • 明確區分 Context 的使用場景
    • 在文件中註明使用的 Context 類型
    • 定期檢查記憶體洩漏
    • 使用工具(如 LeakCanary)來監測記憶體洩漏

重要觀念

  1. 解耦合(Decoupling):依賴注入的最大優點是將物件的建立與使用分離
  2. 生命週期管理:使用適當的 Context 標註來確保正確的生命週期管理
  3. 程式碼可測試性:依賴注入讓我們的程式碼更容易進行單元測試

下一步

在下一篇文章中,我們將深入探討 Hilt Modules 的使用方式,包含:

  1. Module 的基本概念與使用時機
  2. @Provides 與 @Binds 的差異與使用場景
  3. 如何使用 Module 提供介面的實作
  4. Module 的作用域管理
  5. 多 Module 之間的相依關係處理

透過這些進階概念的學習,您將能夠:

  • 更靈活地管理複雜的依賴關係
  • 提供無法使用建構子注入的依賴
  • 實現更好的程式碼模組化
  • 優化應用程式的效能與記憶體使用
avatar-img
13會員
257內容數
哈囉!歡迎光臨我的沙龍!我是 KT,一位對應用程式開發充滿熱情的開發者。在這個專屬空間,我將與您分享我在應用開發領域的深入學習心得和豐富的實戰經驗。如果您對應用程式開發技術同樣充滿好奇,渴望不斷探索新知,歡迎成為我們的會員,一起在應用程式開發的旅途上,探索更深層次的技術世界,享受學習的樂趣。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
HKT實驗室 的其他內容
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現欄位注入(Field Injection)。欄位注入是 Hilt 提供的一種依賴注入方式,允許開發者在類別的欄位上直接使用 @Inject 標註來進行注入。
本篇文章將深入介紹 Android Hilt 依賴注入的基本設定步驟,幫助開發者快速上手這個由 Google 官方推出的相依性注入框架。
本篇文章詳細說明了為何在評估 Dagger、Hilt 和 Koin 三個依賴注入框架後,選擇 Hilt 作為目前 Android 開發的最佳選擇。Hilt 在開發效率最佳化、Google 官方支援、繼承 Dagger 的優點並克服其缺點,以及相較於 Koin 的優勢等方面表現突出。
本篇文章介紹 Android 開發中的依賴注入(Dependency Injection,DI)概念,強調其在現代開發中的重要性。依賴注入能解決類別之間的緊密耦合問題,提升程式碼的可重用性、測試便利性及重構的容易性。文章中舉例說明了未使用依賴注入的缺陷,並展示了使用依賴注入的改良方案。
本文提供全面的 Android Hilt 依賴注入框架完整教學目錄,涵蓋基礎概念、注入方式、進階功能及測試實務。透過這些內容,開發者能夠深入理解並有效學習並運用 Android Hilt 進行依賴注入 Dependency Injection。
本篇文章展示 Android 開發中 Hilt 依賴注入的運用。它基於 Kotlin、Jetpack Compose 等技術搭建,採用 MVVM 架構,利用 Room 存儲數據。Hilt 通過多種注解實現依賴注入,可助學習 Hilt 等多項技術。
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現欄位注入(Field Injection)。欄位注入是 Hilt 提供的一種依賴注入方式,允許開發者在類別的欄位上直接使用 @Inject 標註來進行注入。
本篇文章將深入介紹 Android Hilt 依賴注入的基本設定步驟,幫助開發者快速上手這個由 Google 官方推出的相依性注入框架。
本篇文章詳細說明了為何在評估 Dagger、Hilt 和 Koin 三個依賴注入框架後,選擇 Hilt 作為目前 Android 開發的最佳選擇。Hilt 在開發效率最佳化、Google 官方支援、繼承 Dagger 的優點並克服其缺點,以及相較於 Koin 的優勢等方面表現突出。
本篇文章介紹 Android 開發中的依賴注入(Dependency Injection,DI)概念,強調其在現代開發中的重要性。依賴注入能解決類別之間的緊密耦合問題,提升程式碼的可重用性、測試便利性及重構的容易性。文章中舉例說明了未使用依賴注入的缺陷,並展示了使用依賴注入的改良方案。
本文提供全面的 Android Hilt 依賴注入框架完整教學目錄,涵蓋基礎概念、注入方式、進階功能及測試實務。透過這些內容,開發者能夠深入理解並有效學習並運用 Android Hilt 進行依賴注入 Dependency Injection。
本篇文章展示 Android 開發中 Hilt 依賴注入的運用。它基於 Kotlin、Jetpack Compose 等技術搭建,採用 MVVM 架構,利用 Room 存儲數據。Hilt 通過多種注解實現依賴注入,可助學習 Hilt 等多項技術。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
本課程學習如何在 Kotlin 程式碼檔案中,設定 EditText 輸入框元件。
本課程學習如何使用 Android Studio,撰寫第一行程式碼 Hello World。
本課程主要學習 Android Studio 建立初始(Empty View Activity)專案中的重要目錄資料夾和檔案。
本課程學習如何使用 Android Studio 中的導覽列功能,快速查看方法(function、method)。
本課程學習如何在 Android Studio 上建立手機模擬器。
本課程學習如何建立的第一個 Android Studio 應用程式專案:Hello World。
Thumbnail
本課程介紹開發 Android 手機應用程式所需的開發軟體。建議使用 Google 官方的開發軟體 Android Studio,因其提供完整的支援且免費。
Thumbnail
根據初學者設計了 Kotlin 程式語言的基礎課程,從 Android Studio 到 Android App 開發,提供完整指引。由基礎開始,傳授開發技巧。課程分為三部分:環境安裝、常用元件與界面設計,以及高階技巧如 DataStore、Room 資料儲存與網路處理。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
本課程學習如何在 Kotlin 程式碼檔案中,設定 EditText 輸入框元件。
本課程學習如何使用 Android Studio,撰寫第一行程式碼 Hello World。
本課程主要學習 Android Studio 建立初始(Empty View Activity)專案中的重要目錄資料夾和檔案。
本課程學習如何使用 Android Studio 中的導覽列功能,快速查看方法(function、method)。
本課程學習如何在 Android Studio 上建立手機模擬器。
本課程學習如何建立的第一個 Android Studio 應用程式專案:Hello World。
Thumbnail
本課程介紹開發 Android 手機應用程式所需的開發軟體。建議使用 Google 官方的開發軟體 Android Studio,因其提供完整的支援且免費。
Thumbnail
根據初學者設計了 Kotlin 程式語言的基礎課程,從 Android Studio 到 Android App 開發,提供完整指引。由基礎開始,傳授開發技巧。課程分為三部分:環境安裝、常用元件與界面設計,以及高階技巧如 DataStore、Room 資料儲存與網路處理。