依存性注入とは
@Injectの役割を知る前にまず、依存性注入について理解する必要があります。
依存性注入(DI)
とは、あるクラスが他のクラスに依存している場合、その依存関係(例えば他のクラスやオブジェクト)を自分で作らずに、外部から渡してもらう仕組みです。こうすることで、クラス同士が独立して管理され、テストや変更がしやすくなります。
@Injectの役割
@Inject は、依存性注入を行うためのアノテーションです。つまり、@Inject が付いている場所に必要なオブジェクト(例えば IMongoAccess)を自動的に渡してくれる仕組みを使うことができます。
具体例で説明
class LogRecentCallDAO @Inject private constructor(mongo: IMongoAccess)
このコードの意味を分解して説明します。
1. LogRecentCallDAO クラス
- LogRecentCallDAO というクラスがあります。これが、ある機能(例えば最近の通話履歴のログ)を処理するクラスだとしましょう。
2. @Inject アノテーション
- @Inject は「このクラスを作るときに、必要なものを外から自動的に渡してください」という指示です。これがついていると、クラスを作るときに依存しているオブジェクト(ここでは IMongoAccess)を外部から自動的に注入してくれます。
3. private constructor(mongo: IMongoAccess)
- LogRecentCallDAO のコンストラクタ(クラスを作るときに呼ばれる関数)で mongo: IMongoAccess を受け取ります。つまり、このクラスは IMongoAccess を使うことが前提となっています。
どうして @Inject を使うのか?
- 簡単に依存関係を管理できる:LogRecentCallDAO を使うときに、自分で IMongoAccess を作ったり管理したりする必要がありません。DIフレームワークが自動的にその依存関係を解決してくれます。
- テストがしやすくなる:もし、テストをする場合、IMongoAccess をテスト用に差し替えることができるので、実際のMongoDBに接続することなく、動作確認ができます。
- コードがきれいになる:クラス内で他のクラスを自分で作成するコードが減り、シンプルで管理しやすいコードになります。
まとめ
@Inject は「このクラスが依存しているオブジェクトを自動的に外から渡してくれる」という意味です。これによって、コードが簡単に管理でき、テストや変更も楽になります。