匕首单身vs科特林物件

Mah*_*zad 11 android unit-testing dependency-injection kotlin dagger-2

要定义单例,应该使用kotlin对象声明还是使用普通的kotlin类并使用匕首注入它?我认为第一种选择肯定更容易,但是在这种情况下我可能不知道使用匕首的原因。

选项1(notice object关键字):

object SomeUtil {
    // object state (properties)

    fun someFunction(number: Long) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2(notice class关键字):

class SomeUtil {
    // object state (properties)

    fun someFunction(number: Long) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)
@Module
class AppModule {

    @Provides
    @Singleton
    internal fun provideTheUtil() = SomeUtil()
}
Run Code Online (Sandbox Code Playgroud)
class MainActivity : BaseActivity() {

    @Inject internal lateinit var util: SomeUtil
}
Run Code Online (Sandbox Code Playgroud)

更新2019-07-03

@Blackbelt在评论中说,为了可测试性,我们应该选择选项2。但是,像图书馆MockK可以嘲笑object小号了。那么您是否仍然认为选项2是首选?

tyn*_*ynn 3

NumberFormatUtil您可能想重新考虑成为单身人士的必要性。如果直接与Dagger甚至没有任何瞄准镜的工厂@Reusable一起使用可能会更便宜。

如果NumberFormatUtil相当简单并且只提供一些实用方法,没有状态并且不需要在测试中进行模拟,那么您可以使用一个object实现,也许@JvmStatic用于Java互操作性。但是,您也可以使用全局实用程序(扩展)函数:

package xyz

fun formatNumber(number: Long) {
    // ...
}

fun Long.format() = formatNumber(this)
Run Code Online (Sandbox Code Playgroud)