TIL: Dagger Instantiation Recursion

TIL というか久しぶりにやったので記録。

@XxScoped
class A {
  @Inject A(Lazy<B> b) {
    b.get();
  }
}

@XxScoped class B { @Inject B(Lazy<A> a) { a.get(); } }

とかやるとあーら不思議、A の constructor が何度も呼ばれてしまいます。ふつうはこんなわかりやすい例じゃなくてもうちょっと入り組んでいるが、スタックトレースをダンプすれば多少入り組んでいても一目瞭然である。

コンストラクタでなんかするのを止めろ、が一般的な良い解決。ただし今日は俺のコードじゃねー的な場面なので適当に直します。

理論上は静的にチェックできるはずとはいえ Lazy がそういうチェックを回避する手段なのでチェックで弾くのは本末転倒。動的にチェックするのはどうかというと、それも可能だけれど、どのみちクラッシュするので労には見合わなそう。