Dagger 2とその他の依存性注入フレームワークは、コンストラクタを管理することでテストが簡単な単一責任クラスを作成するのに役立ちます。これが主な利点です。
質問の特定のコード(RecyclerView.Adapter
の場合)では、Dagger 2または依存関係注入を使用して得られる利益はありません。new
キーワードと静的ファクトリを使用してビューを拡張しても問題ありません。言い換えれば
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
ここダガー2を使用してもポイントがないので、あなたはモックのため、実際の依存関係に交換することによりViewHolder
をテストされることはありません。あなたはこのようなものに終わるだろうどこでデータバインディングを使用して検討することもでき、読みやすさを向上したい場合
:
return new ViewHolder(ListItemBinding.inflate(LayoutInflater.from(parent.getContext())));
また、あなたが生成するための非常に複雑なロジックを持っていた場合、ViewHolder
あなたは注入可能性アクティビティにRecyclerView.Adapter
を追加します。次に、あなたのアダプタ内ViewHolderFactory
を注入し、ビューを作成することを使用することができます。
private final Context context;
private final ViewHolderFactory viewHolderFactory;
@Inject
MyAdapter(Context context, ViewHolderFactory viewHolderFactory) {
this.context = context;
this.viewHolderFactory = viewHolderFactory;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return ViewHolderFactory.create(view);
}
簡単にViewHolderFactory
に対してではなく、ヘビー級アダプタに対してテストすることも可能であろう。
これは本当に単なる意見です。私は個人的にビューの作成とインフレにはダガーを使用しませんが、ビジネスロジックのものについては –
@DavidMedenjakと同意します。私は、アクティビティ/フラグメントを注入してそこから手動でオブジェクトグラフを構築する方法を好む。 (つまり、アダプターのコンストラクターとViewHoldersの内容を渡します)。あなたがそれを挿入したいなら、おそらく最も簡単な方法はコンポーネントに '注入(ViewHolder)'メソッドを作成し、 '@ Inject'アノテーションを持つパッケージプライベートフィールドを持つことでしょう。 – theFunkyEngineer