在 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
留言分享你的想法!
avatar-img
HKT實驗室
24會員
261內容數
哈囉!歡迎光臨我的沙龍!我是 KT,一位對應用程式開發充滿熱情的開發者。在這個專屬空間,我將與您分享我在應用開發領域的深入學習心得和豐富的實戰經驗。如果您對應用程式開發技術同樣充滿好奇,渴望不斷探索新知,歡迎成為我們的會員,一起在應用程式開發的旅途上,探索更深層次的技術世界,享受學習的樂趣。
HKT實驗室的其他內容
2025/01/27
本文介紹如何在 Android 專案中使用 Hilt Modules,強調其在依賴注入中的重要性。Modules 有助於組織和提供依賴,管理複雜關係,提供介面實作,並控制物件生命週期。將深入探討 Modules 的概念、使用時機與實作方式。
Thumbnail
2025/01/27
本文介紹如何在 Android 專案中使用 Hilt Modules,強調其在依賴注入中的重要性。Modules 有助於組織和提供依賴,管理複雜關係,提供介面實作,並控制物件生命週期。將深入探討 Modules 的概念、使用時機與實作方式。
Thumbnail
2025/01/27
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現欄位注入(Field Injection)。欄位注入是 Hilt 提供的一種依賴注入方式,允許開發者在類別的欄位上直接使用 @Inject 標註來進行注入。
Thumbnail
2025/01/27
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現欄位注入(Field Injection)。欄位注入是 Hilt 提供的一種依賴注入方式,允許開發者在類別的欄位上直接使用 @Inject 標註來進行注入。
Thumbnail
2025/01/26
本篇文章將深入介紹 Android Hilt 依賴注入的基本設定步驟,幫助開發者快速上手這個由 Google 官方推出的相依性注入框架。
Thumbnail
2025/01/26
本篇文章將深入介紹 Android Hilt 依賴注入的基本設定步驟,幫助開發者快速上手這個由 Google 官方推出的相依性注入框架。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
本文介紹如何在 Android 專案中使用 Hilt Modules,強調其在依賴注入中的重要性。Modules 有助於組織和提供依賴,管理複雜關係,提供介面實作,並控制物件生命週期。將深入探討 Modules 的概念、使用時機與實作方式。
Thumbnail
本文介紹如何在 Android 專案中使用 Hilt Modules,強調其在依賴注入中的重要性。Modules 有助於組織和提供依賴,管理複雜關係,提供介面實作,並控制物件生命週期。將深入探討 Modules 的概念、使用時機與實作方式。
Thumbnail
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現建構子注入 (Constructor Injection)。補充什麼是建構子,建構子注入基礎與相依類別的設定與 Application 和 Activity Context 注入方式。
Thumbnail
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現建構子注入 (Constructor Injection)。補充什麼是建構子,建構子注入基礎與相依類別的設定與 Application 和 Activity Context 注入方式。
Thumbnail
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現欄位注入(Field Injection)。欄位注入是 Hilt 提供的一種依賴注入方式,允許開發者在類別的欄位上直接使用 @Inject 標註來進行注入。
Thumbnail
本篇文章分享如何在 Android 專案中使用 Hilt 框架實現欄位注入(Field Injection)。欄位注入是 Hilt 提供的一種依賴注入方式,允許開發者在類別的欄位上直接使用 @Inject 標註來進行注入。
Thumbnail
本篇文章將深入介紹 Android Hilt 依賴注入的基本設定步驟,幫助開發者快速上手這個由 Google 官方推出的相依性注入框架。
Thumbnail
本篇文章將深入介紹 Android Hilt 依賴注入的基本設定步驟,幫助開發者快速上手這個由 Google 官方推出的相依性注入框架。
Thumbnail
本篇文章介紹 Android 開發中的依賴注入(Dependency Injection,DI)概念,強調其在現代開發中的重要性。依賴注入能解決類別之間的緊密耦合問題,提升程式碼的可重用性、測試便利性及重構的容易性。文章中舉例說明了未使用依賴注入的缺陷,並展示了使用依賴注入的改良方案。
Thumbnail
本篇文章介紹 Android 開發中的依賴注入(Dependency Injection,DI)概念,強調其在現代開發中的重要性。依賴注入能解決類別之間的緊密耦合問題,提升程式碼的可重用性、測試便利性及重構的容易性。文章中舉例說明了未使用依賴注入的缺陷,並展示了使用依賴注入的改良方案。
Thumbnail
本文提供全面的 Android Hilt 依賴注入框架完整教學目錄,涵蓋基礎概念、注入方式、進階功能及測試實務。透過這些內容,開發者能夠深入理解並有效學習並運用 Android Hilt 進行依賴注入 Dependency Injection。
Thumbnail
本文提供全面的 Android Hilt 依賴注入框架完整教學目錄,涵蓋基礎概念、注入方式、進階功能及測試實務。透過這些內容,開發者能夠深入理解並有效學習並運用 Android Hilt 進行依賴注入 Dependency Injection。
Thumbnail
本篇文章展示 Android 開發中 Hilt 依賴注入的運用。它基於 Kotlin、Jetpack Compose 等技術搭建,採用 MVVM 架構,利用 Room 存儲數據。Hilt 通過多種注解實現依賴注入,可助學習 Hilt 等多項技術。
Thumbnail
本篇文章展示 Android 開發中 Hilt 依賴注入的運用。它基於 Kotlin、Jetpack Compose 等技術搭建,採用 MVVM 架構,利用 Room 存儲數據。Hilt 通過多種注解實現依賴注入,可助學習 Hilt 等多項技術。
Thumbnail
本篇文章詳細介紹如何在 Android 開發中使用 Dagger 2 進行依賴注入,並提供 GitHub 開源程式碼連結。專案基於 MVVM 架構,採用 Jetpack Compose 構建現代化 UI,展示實際應用中的最佳實踐。
Thumbnail
本篇文章詳細介紹如何在 Android 開發中使用 Dagger 2 進行依賴注入,並提供 GitHub 開源程式碼連結。專案基於 MVVM 架構,採用 Jetpack Compose 構建現代化 UI,展示實際應用中的最佳實踐。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
不管用哪種語言開發軟體,除非是那種一個 function 寫個幾萬行的人 (來人啊,把這種人拖去砍了),不然,一般都會根據某些因素,切割成模組或是特定功能的區塊 (一個 class 或是一個 function),但要完成一個特定功能,這些模組或區塊勢必要一起合作,因此這些模組與區塊就發生了關係。
Thumbnail
不管用哪種語言開發軟體,除非是那種一個 function 寫個幾萬行的人 (來人啊,把這種人拖去砍了),不然,一般都會根據某些因素,切割成模組或是特定功能的區塊 (一個 class 或是一個 function),但要完成一個特定功能,這些模組或區塊勢必要一起合作,因此這些模組與區塊就發生了關係。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News