2012-01-26 14 views
6

可能性の重複:
Guice with parentsGuiceを使用して、スーパークラスのコンストラクタパラメータを挿入するにはどうすればよいですか?

私は例えば、 childrensBookは、タイトル "不思議の国のアリス" と ScienceBookを割り当てる必要があり、サブクラスに本のタイトルを注入したい
class Book{string title;} 
class ChildrensBook extends Book{} 
class ScienceBook extends Book{} 

べき「種の起源について」を得る。 Guiceでこれをどのように達成できますか?

(私はサブクラスでtitleフィールドを上書きしたくないことに注意してください)

+2

は、それは、クラスが定義されているか、本当にですか?これらの3つのクラスのソースコードを変更することはできますか?サブクラスのカラーフィールドのセッターにアクセスできますか? –

答えて

0

あなたの最善の策は、おそらく異なるパラメータの注釈とサブクラスのコンストラクタを書くことになる - これまで

class ChildrensBook extends Book { 
    @Inject ChildrensBook (@AliceInWonderland String title) { 
    super(title); 
    } 
} 
+1

downvoteを説明してください。 –

5

のようなものを尋ねたとanswered here:GuiceのベストプラクティスのMinimize Mutabilityセクションに埋もれ

、あなたはこのガイドラインを見つけることができます:

サブクラスは、すべての依存関係を持つsuper()を呼び出す必要があります。これにより、 コンストラクタの注入が煩雑になります。特に注入されたベースとして クラスが変更されました。実際に

、ここではコンストラクタ・インジェクションを使用してそれを行う方法は次のとおりです。

public class TestInheritanceBinding { 
    static class Book { 
     final String title; 
     @Inject Book(@Named("GeneralTitle") String title) { 
     this.title = title; 
     } 
    } 
    static class ChildrensBook extends Book { 
     @Inject ChildrensBook(@Named("ChildrensTitle") String title) { 
     super(title); 
     } 
    } 
    static class ScienceBook extends Book { 
     @Inject ScienceBook(@Named("ScienceTitle") String title) { 
     super(title); 
     } 
    } 

    @Test 
    public void bindingWorked() { 
     Injector injector = Guice.createInjector(new AbstractModule() { 
     @Override protected void configure() { 
      bind(String.class). 
      annotatedWith(Names.named("GeneralTitle")). 
      toInstance("To Kill a Mockingbird"); 
      bind(String.class). 
      annotatedWith(Names.named("ChildrensTitle")). 
      toInstance("Alice in Wonderland"); 
      bind(String.class). 
      annotatedWith(Names.named("ScienceTitle")). 
      toInstance("On the Origin of Species"); 
     } 
     }); 
     Book generalBook = injector.getInstance(Book.class); 
     assertEquals("To Kill a Mockingbird", generalBook.title); 
     ChildrensBook childrensBook = injector.getInstance(ChildrensBook.class); 
     assertEquals("Alice in Wonderland", childrensBook.title); 
     ScienceBook scienceBook = injector.getInstance(ScienceBook.class); 
     assertEquals("On the Origin of Species", scienceBook.title); 
    } 
} 
+0

-1、申し訳ありません。あなたがリンクしているページは、あなたが何を主張しているかを言わない。あなたは、その意味を劇的に変える方法で文脈から引用を引っ張ってきました。結果として、あなたはそのソースによって特に劣っていると呼ばれるアプローチを推奨しています。 – ruakh

関連する問題