Kotlinで依存性注入を実現するDagger/Hiltの基本をやさしく解説!初心者向けDI入門
生徒
「Kotlinでアプリを作っているんですが、クラス同士のつながりが増えてきて、コードがごちゃごちゃしてきました…」
先生
「それは依存性が増えているという状態ですね。そんなときには依存性注入(DI)という考え方が役立ちますよ。」
生徒
「依存性注入?なんだか難しそう…」
先生
「大丈夫。KotlinではDaggerやHiltという便利なツールを使って簡単にDIができるんです。一緒にゆっくり学んでいきましょう!」
1. 依存性注入(DI)とは?
依存性注入とは、あるクラスが別のクラスを必要としているときに、自分で作らずに外から渡してもらう仕組みのことです。
たとえば、コンビニの店員さんが「レジを使いたい」と思ったとき、毎回レジを作るのではなく、あらかじめレジが用意されている状態にしておけば便利ですよね?それと同じ発想です。
2. DaggerとHiltの違い
Dagger(ダガー)は、Googleが提供する依存性注入ライブラリです。KotlinやJavaで広く使われています。
ただし、Daggerは少し設定が複雑という弱点があります。そこで登場したのがHilt(ヒルト)です。
HiltはDaggerを簡単に使えるようにしたラッパーで、特にAndroidアプリ開発で便利に使えます。
つまり、中身はDaggerだけど、操作はHiltで簡単にというイメージです。
3. Hiltを使う準備をしよう
Hiltを使うには、Gradleファイルにいくつかの設定を追加します。以下のように記述しましょう。
// build.gradle(Project)に追加
classpath("com.google.dagger:hilt-android-gradle-plugin:2.44")
// build.gradle(Module)に追加
plugins {
id("com.google.dagger.hilt.android")
kotlin("kapt")
}
dependencies {
implementation("com.google.dagger:hilt-android:2.44")
kapt("com.google.dagger:hilt-android-compiler:2.44")
}
これでHiltの準備はOKです。プロジェクトを同期(Sync)して反映しましょう。
4. 実際に依存性注入をやってみよう
ここからは、Hiltを使ったKotlinの実装例を紹介します。
① クラスを用意する
まずは、ログ出力用のクラスを作ってみます。
class Logger {
fun log(message: String) {
println("ログ: $message")
}
}
② DIされるクラスに注釈を付ける
Hiltに「このクラスを使いたいです」と伝えるには@Injectを使います。
class UserService @Inject constructor(
private val logger: Logger
) {
fun execute() {
logger.log("ユーザー処理を実行中")
}
}
③ 提供元を教えるModuleを書く
Loggerクラスのインスタンスをどう提供するかHiltに教えるために@Moduleと@Providesを使います。
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideLogger(): Logger {
return Logger()
}
}
④ 実行クラスで使う
依存性を注入したい場所では@AndroidEntryPointを付けて、by inject()で呼び出せます。
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var userService: UserService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
userService.execute()
}
}
5. 実行結果を確認しよう
アプリを起動すると、次のようにログが出力されます。
ログ: ユーザー処理を実行中
6. Hiltの便利なポイント
- 自動で依存性を解決してくれるので、手作業が減る
- テストやモック化がしやすい
- コードがシンプルに保てるので、初心者にもわかりやすい
たとえば、Loggerクラスをあとから別の実装に差し替えたいときも、Moduleの中だけ変更すればOKです。
7. よくある初心者の疑問
Q. なぜ自分でnewしてはいけないの?
自分でインスタンスを作ってしまうと、クラス同士が強く結びついてしまい、変更やテストがしにくくなるからです。DIを使えば、緩くつながるようになり、柔軟な設計ができます。
Q. DaggerとHilt、どっちを使えばいい?
初心者やAndroid開発が中心の人にはHiltがおすすめです。設定がシンプルで学びやすく、公式もHiltを推奨しています。
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazonアソシエイト・プログラムを利用しています