2012-05-17 21 views
1

在代碼審查中出現了以下評論:「我認爲,您實際上是想將工廠注入實例,以便在需要時重新綁定工廠。」和「重要提示:工廠不應該是靜態的,而應該注入。」注入工廠 - 如何以及爲什麼?

Test.java:

Foo foo = FooFactory.get(argument); 

FooFactory.java:

public final class FooFactory { 
    public static Foo get(String argument) { 
     return new Foo(); 
    } 
} 

我應該如何以其他方式做呢?在評論者的第一評論中,「重新綁定」意味着什麼?

+1

也許你應該問評論者她的意思。 –

+0

您是否要求代碼審查人員更詳細地向您解釋?就我個人而言,我不知道他在說什麼。 – DGH

+0

「rebinding」會給你買什麼?如果你的工廠不是基於界面的,我沒有理由注入。 – duffymo

回答

6

通過做你所做的,你基本上忽略了依賴注入,並且使用了一個靜態工廠。因此,如果在單元測試中,您希望工廠返回Foo的假實例而不是真實實例,則不能。

相反,你應該使用依賴注入(這裏春天爲例):

public class SomeService 
    private FooFactory fooFactory; 

    @Autowired 
    public SomeService(FooFactory fooFactory) { 
     this.fooFactory = fooFactory; 
    } 

    public void someMethod(String arg) { 
     Foo foo = fooFactory.create(arg); 
     ... 
    } 
    .... 
} 

而現在,在單元測試,你可以注入任何FooFactory實現你想要的(通常,一個模擬)。

+0

有單元測試,所以我認爲這是評論者的意思。非常感謝這個答案! –

+0

我是DI新手。在這裏建立工廠確實很棒,但工廠將使用new關鍵字實例化Foo,這會導致foo對象不受DI容器管理。這樣可以嗎?我想我的問題是,什麼時候應該由一個容器管理一個類,什麼時候可以使用新的關鍵字?謝謝! – KFL

3

對於大多數依賴項注入框架,您可以在運行時綁定特定的對象實現。我敢打賭,這也是評論家所指的。爲了利用這一點,你當然必須注入你的工廠,而不是靜態創建它。