2011-12-08 52 views
2

我正在調試Guice沒有調用構造函數的情況。 它成功執行Foo foo = injector.getInstance(Foo.class)Foo是一個具體的類),並且調試器顯示foo在此語句後不爲空......但尚未調用構造函數。Injector.getInstance()總是調用構造函數嗎?

foo的所有字段都是空的,並且我沒有調用在磁盤上創建文件的構造函數中放置的語句。

沒有其他構造函數,並且Foo不是單例 - 只是正常綁定。應用程序啓動時發生這種情況。 Foo的構造函數是從來沒有運行 - 我提到它試圖在構造函數中創建的文件永遠不會創建,這意味着構造函數代碼永遠不會運行。

我在Play Framework的引導類中運行,試圖連接Guice在having some problems with Play's Guice Module之後使用它。

編輯 - 我剛剛發現我有一個失蹤@Inject的構造函數(它有參數,而@Inject是強制性這樣的​​構造函數)。但問題仍然有效 - 這裏發生了什麼? Guice是否創建了對象而不運行構造函數,還是Play?

+2

'getInstance()'有可能返回一個緩存的(例如,先前構造的)實例。 –

+0

@MДΓΓБДLL - 感謝上帝的自動完成暱稱。我編輯了這個問題 - 構造函數從未運行過 - 如果是這樣的話,它會在磁盤上創建一個文件。該模塊是空的,並且該對象沒有標記爲'@ Singleton',所以Guice本身不應該在這裏緩存任何東西。 – ripper234

回答

1

不,完全沒有。存在的範圍(例如單例)用於控制何時創建(而不是創建)新對象。此外,某些東西可能會綁定到對象的現有實例。例如,如果FooenumgetInstance肯定不會調用構造函數。

至於究竟發生了什麼,我不能說。對於通常綁定的內容(例如,不是提供者或現有實例),Guice只應創建一個對象,如果該對象具有帶註釋的構造函數@Inject或僅具有單個無參數構造函數。

+0

'Foo'通常是綁定的,不是一個枚舉,也不是'@ Singleton'。構造函數代碼從未運行過這個對象,否則我會看到在磁盤上創建的文件。可怕的事情正在發生。 – ripper234