🔍 依存性注入(DI)ってなぜ必要?
「依存性注入(Dependency Injection)」は単なる流行りではなく、モダンAndroid開発における基盤アーキテクチャです。
DIを使うと:
- ✅ テストが簡単に(モックが使いやすくなる)
- ✅ ボイラープレート削減(
MyClass(context, api, db, ...)
から卒業) - ✅ モジュール化が進む(実装の差し替えも楽々)
😱 DIを使わないとどうなる?
class UserRepository {
private val api = ApiService()
private val db = Database()
}
class UserViewModel {
private val repo = UserRepository() // がっつり依存!
}
これはテストもメンテも辛い…。
🛠️ Hilt登場!Google公式のDIライブラリ
Hiltは Daggerベース のAndroid専用DIライブラリで、Daggerよりも圧倒的にシンプル!
✅ Step 1: GradleにHiltを追加
// app/build.gradle.kts
plugins {
id("com.google.dagger.hilt.android")
kotlin("kapt")
}
dependencies {
implementation("com.google.dagger:hilt-android:2.48")
kapt("com.google.dagger:hilt-compiler:2.48")
}
✅ Step 2: アプリケーションクラスに初期化処理
@HiltAndroidApp // Hilt用のコード生成をトリガー
class MyApp : Application()
🧩 よく使うHiltアノテーションまとめ
1️⃣ @Inject
:依存性を注入
class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService
)
2️⃣ @Provides
:依存性の定義(モジュール)
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideAnalyticsService(): AnalyticsService =
Retrofit.Builder()
.baseUrl("https://example.com/")
.build()
.create(AnalyticsService::class.java)
}
3️⃣ @AndroidEntryPoint
:ActivityやFragmentに注入
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
analytics.track("Activity Created")
}
}
🧪 実用例:MVVM × Hilt
// Repository(モジュールで提供)
class UserRepository @Inject constructor(
private val api: ApiService
)
// ViewModel(Hiltが依存解決!)
@HiltViewModel
class UserViewModel @Inject constructor(
private val repo: UserRepository
) : ViewModel()
// Fragmentで使用
@AndroidEntryPoint
class UserFragment : Fragment() {
private val viewModel: UserViewModel by viewModels()
}
🔒 スコープで依存性のライフサイクルを制御
-
@Singleton
→ アプリ全体で1つのインスタンス -
@ActivityScoped
→ アクティビティ単位で生存
@ActivityScoped
class NavigationManager @Inject constructor() { /* ... */ }
💡 なぜHiltなのか?
- ✅ 最小限の記述(Daggerより簡単)
- ✅ Jetpackと統合済み(ViewModel・WorkManagerなど)
- ✅ コンパイル時エラーで安心(コード自動生成)
🚀 最後に:Hilt導入のコツ
まずは 1つの機能(例:Analytics) にHiltを導入してみましょう。
- ✅ アーキテクチャがスッキリ
- ✅ ユニットテストが高速化
- ✅ デバッグがラクに
DIはオプションじゃない。プロフェッショナルAndroid開発の必須技術です!😎
📚 参考リンク
🏷 おすすめタグ(Qiita用)
Android, Kotlin, Hilt, DI, 開発効率化