2016-07-27 38 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'方法)。 –