Daggerを使う時、以下のようなコードをよく書くかと思います。
public interface IRepository {
Item fetch();
}
public class RepositoryImpl implements IRepository {
@Override
public Item fetch() {
// 何らかの実装
}
}
@Module
class Module {
@Provides
IRepository provideRepository(RepositoryImpl repository) {
return repository;
}
}
@Binds
を利用することで、上記と等価なコードを以下のように書くことができます。
@Modlule
abstract class Module {
@Binds
abstract IRepository provideRepository(RepositoryImpl repository);
}
前者と後者の違いをまとめると以下になります。
-
@Provides
の代わりに@Binds
を利用していること - クラスとプロバイダメソッドが
abstract
であること
記述量が減るため、プロバイダメソッドを書くのが楽になります。
しかし、同一Module内に@Provides
を利用したプロバイダメソッドを定義することはできないので、そこだけ注意が必要です。