Roomを利用する場合(2)
ViewModelの変更
第3回に紹介したように、ViewModel+リポジトリ+Roomを利用する場合、どうしてもApplicationContextが必要になる関係上、ViewModelはAndroidViewModelを利用する必要がありました。
一方、Hiltを利用して前項で紹介したモジュールを作成した場合、この必要がなくなります。ViewModelクラスは、通常のViewModelを継承したクラスで済むようになり、Javaならばリスト9、Kotlinならばリスト10のコードとなります。
ViewModel内で利用するCocktailmemoRepositoryも注入されるように、コンストラクタインジェクションを利用します。
@HiltViewModel
public class MainViewModel extends ViewModel {
private final CocktailmemoRepository _cocktailmemoRepository;
:
@Inject
public MainViewModel(CocktailmemoRepository cocktailmemoRepository) {
_cocktailmemoRepository = cocktailmemoRepository;
:
}
:
}
@HiltViewModel
class MainViewModel
@Inject
constructor(cocktailmemoRepository: CocktailmemoRepository) : ViewModel() {
:
}
リポジトリの変更
また、これに伴い、リポジトリのコンストラクタの引数も変更になります。これも、第3回のリスト8やリスト9で紹介したように、ViewModelからApplicationを受け取り、AppDatabaseを生成するコードが必要でした。
これも不要になり、代わりにコンストラクタインジェクションを利用し、DAOインスタンスを直接注入してもらうようにします。
Javaならばリスト11、Kotlinならばリスト12のようになります。
public class CocktailmemoRepository {
private final CocktailmemoDAO _cocktailmemoDAO;
@Inject
public CocktailmemoRepository(CocktailmemoDAO cocktailmemoDAO) {
_cocktailmemoDAO = cocktailmemoDAO;
}
:
}
class CocktailmemoRepository
@Inject
constructor(
private val _cocktailmemoDAO: CocktailmemoDAO
) {
:
}
このように、Hiltを利用することで依存関係の管理をDIライブラリに任せることができ、アノテーションの付与でインスタンスを受け取れるようになります。よりコードがスッキリするのがわかっていただけると思います。
まとめ
Android Jetpackについて紹介していく本連載の最終回は、いかがでしたでしょうか。
今回は、Android開発でDI(Dependency Injection)を実現するHiltのうち、フィールドインジェクションとViewModelのインジェクション、さらにモジュールの利用方法を紹介しました。
長らく続いたこの連載も、今回で最終回です。本連載で紹介したJetpackの各ライブラリを利用することで、よりモダンなAndroid開発が可能となります。その一端でも理解していただけたならば、うれしい限りです。
