Skip to content

Instantly share code, notes, and snippets.

@nokok
Last active June 11, 2021 03:00
Show Gist options
  • Save nokok/a7da9c947afd5edc47bd6c7e994cf254 to your computer and use it in GitHub Desktop.
Save nokok/a7da9c947afd5edc47bd6c7e994cf254 to your computer and use it in GitHub Desktop.

package privateメソッドでは同シグネチャのメソッドが継承先のクラスに存在した場合でも、継承元と先のクラスが属するパッケージが異なる場合オーバーライドされていないので別のメソッドとして取り扱う

class pkg1.A {
  // Inject対象
  @Inject
  void inject() {}
  
  // Inject対象
  @Inject
  void same() {}
}

class pkg2.B extends pkg1.A {
  // Inject対象外
  void inject() {}
  
  // Inject対象
  @Inject
  void same() {}
}

privateメソッドはオーバーライドできないので、@Injectが付与されたメソッドそれぞれがInject対象となる(同シグネチャでも別のメソッドとして取り扱う)

class A {
  // Inject対象
  @Inject
  private void inject() {}
  
  // Inject対象
  @Inject
  private void inject1() {}
}

class B extends A {
  // Inject対象外
  private void inject() {}
  
  // Inject対象
  @Inject
  private void inject1() {}
}

オーバーライド先のメソッドで@Injectが付与されていなければInject対象とならない(アノテーションもオーバーライドされるため)

class A {
  // Inject対象外
  @Inject
  void inject() {}
}

class B extends A {
  // ここで@Injectが消去されてオーバーライドされている
  void inject() {}
}

同じ継承関係でもこの場合はBクラスをnewするときはB#injectのみをInjectし、Cクラスをnewするときはどのinjectメソッドも実行してはならない

class A {
  @Inject
  public void inject() {}
}
class B extends A {
  @Inject
  public void inject() {}
}
class C extends B {
  public void inject() {}
}

(一つ前の続き)ただし、この場合はBクラスをnewするときは1と2をInjectし、Cクラスをnewするときは2と3がInject対象となる

class pkg1.A {
  // 1
  @Inject
  void inject() {}
}
class pkg2.B extends pkg1.A {
  // 2
  @Inject
  void inject() {}  
}
class pkg1.C extends pkg2.B {
  // 3
  @Inject
  void inject() {}
}

// 1と2がInject対象
Injector.getInstance(B);
// 2と3がInject対象
Injector.getInstance(C);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment