2012-02-26 3 views
4

다음 코드에서 내 기본 클래스의 생성자에 "삽입"주석을 달아야합니까? 기본 클래스가 추상 클래스 인 경우는 어떻습니까?Java 및 Guice - 상속 및 추상화를 처리하는 방법?

DI를 사용할 때 생성자에서 super를 호출해야합니까?

public class Base { 

    @Inject 
    public Base(IConfig config) { 
     // Do stuff 
    } 
} 

public class A extends Base { 

    @Inject 
    public A(IConfig config) { 
     super(config); 
    } 
} 
+0

콘크리트 주입식 클래스를 정확히 확장해야하는 이유는 무엇입니까? 사람들이이 일을하려고하는 곳에서 개인적으로 보았던 대부분의 경우는 다른 방법을 통해 더 잘 해결할 수 있습니다. 예를 들어, 생성자 매개 변수가 제공되는 방법을 변경하는 경우'@ Provides' 메소드와 같은 것이 훨씬 더 잘 작동하는 경향이 있습니다. 구체적인 메소드를 오버라이드하는 것이라면 이는 기본 클래스가 현실적인 사용 사례를 다루지 않고 어쨌든 재 설계해야한다는 신호입니다. 그리고 Guice 우수 사례 위키는'@Inject public' 생성자에 대해 경고합니다 (http://code.google.com/p/google-guice/wiki/KeepConstructorsHidden 참조) –

답변

4

바인딩 할 항목에 따라 다릅니다. BaseA (bind(Base.class).to(A.class))에 바인딩하면 네 번째 생성자와 @Inject가 필요하지만 Base에있는 생성자는 필요하지 않습니다. Base도 작성할 계획이면 @Inject이 필요합니다.

super()에 대한 호출과 관련하여 Java는 IConfig가있는 생성자가 하나 뿐인 경우 Guice와 관련이 없습니다. 그러나 IConfigBase에 삽입 할 필요가 없다면 제거하지 못할 수 있습니다.