2016-07-27 59 views
1

爲什麼要在提供方法之前使用靜態修飾符?Dagger2中的靜態提供方法

即使我刪除了靜態修飾符,dagger2也能正常工作。

@Provides static Pump providePump(Thermosiphon pump) { 
    return pump; 
} 
+1

我不知道。實際上,我認爲這些文件是在說謊。你打算如何覆蓋模擬的靜態提供者方法?你不能。因此,添加'static'實際上是愚蠢的,並且這樣做的文檔是毫無意義的。雖然它也以其「咖啡例子」而聞名,但它實際上並沒有告訴你如何使用這個庫,所以難怪它做了其他沒有意義的事情。/rant – EpicPandaForce

回答

6

兩種風格都適用;你是否保持靜態方法完全取決於你和普通的「這是靜態的方法」判斷。在這裏,pump對模塊實例沒有任何用處,因此該方法可以很容易地爲靜態。

靜態方法調用速度更快,particularly in Android,因爲它們避免了虛擬方法表查找。這也可以使編譯器,JIT運行時或靜態分析工具更容易內聯。我猜想你可以通過製作類別或方法final來打開類似的優點。

鑑於靜態方法不受實例字段限制,可讀性也可能有所改善,但這取決於您。

如果您確信您的@Provides方法的行爲是不會改變,包括在測試中,那麼您可以利用性能/可讀性增加。但是,如果您需要引用模塊狀態或想要允許子類/測試覆蓋,則實例方法必然是正確的調用。

+0

感謝您提供何時使用以及使用原因的想法。這很清楚。我會將此標記爲答案。 –

+0

嗯,他們在Dagger文檔中使用靜態方法進行測試https://google.github.io/dagger//testing.html請參閱底部的'@Provides static AuthManager authManager',是他們的錯誤,還是我錯過了什麼? – arekolek

+0

@arekolek沒有錯誤;該模塊是FakeAuthModule,用於測試,但_never未更改或重寫,因爲它是「選項2:分離組件配置」中的僅測試模塊。用於測試的非最終方法專門用於啓用「選項1:通過子類化模塊覆蓋綁定(不要這樣做!)」,其標題警告基於該頁面上列出的限制。我並不反對:除了非常快速或有限的覆蓋(或爲覆蓋而設計的模塊),您可能需要單獨的Component來測試單獨的模塊(以及抽象或靜態的'@Provide'方法)。 –