2016-03-18 28 views
0

https://github.com/google/guice/wiki/AssistedInjectGuice的FactoryModuleBuilder可以使用@AutoValue嗎?

可以說我有一個接口A,實現類AImpl和另一個接口AFactory,我與FactoryModuleBuilder使用 -

.. 

install(new FactoryModuleBuilder() 
    .implement(A.class, AImpl.class) 
    .build(AFactory.class) 
); 

.. 

是否有可能使用AutoValueAImpl?我的擔心是AImpl將是抽象的,工廠模塊將不能實例化它。如果我通過AutoValue_AImpl而不是工廠模塊,它將不會有@Assisted*註釋。

+0

爲什麼不嘗試呢? –

+0

我試過了。 @AssistedInject不能放在構造函數以外的方法上。所以我不能在'AImpl'中使用它。而且我無法訪問'AutoValue_AImpl'中的構造函數,因爲這是生成的代碼 – 0cd

回答

1

這些軟件包不能很好地協同工作;更重要的是,有沒有理由你應該一起使用這兩個功能。

AutoValue通常創建數據對象值對象,具有強大的equalshashCode實現。從AutoValue創建的對象是不可變的,使用靜態工廠方法代替構造函數; Guice提供的依賴關係沒有空間或理由。請參閱the docs

使用AutoValue將您的公共創建API限制爲靜態工廠方法,而不是構造函數。無論如何,參見Effective Java Item 1有幾個原因,這通常是一個好主意。

AutoValue不會也不會支持創建可變值類型。 (我們可以考慮增加對withField式的方法,改變返回原實例的新一成不變的副本有一個字段值的支持。)

FactoryModuleBuilder一般爲有一定的依賴注入和一些manually-對象創建工廠指定的依賴關係。如上所述,AutoValue包不應該符合這個描述。

當然,你可以使用Guice中的常量來構建你的值對象;但是,您需要通過編寫自己的輕量級工廠對象來完成此操作,該對象根據需要將可注射參數映射到值對象的方法。

相關問題