Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 匕首单体vs科特林物体_Android_Unit Testing_Kotlin_Dependency Injection_Dagger 2 - Fatal编程技术网

Android 匕首单体vs科特林物体

Android 匕首单体vs科特林物体,android,unit-testing,kotlin,dependency-injection,dagger-2,Android,Unit Testing,Kotlin,Dependency Injection,Dagger 2,要定义单例,我应该使用Kotlin对象声明还是创建一个普通的Kotlin类并使用dagger注入它?在我看来,第一种选择肯定更容易,但在这种情况下使用匕首可能有一个我不知道的原因 选项1(注意对象关键字): objectsomeutil{ //对象状态(属性) 功能(编号:长){ // ... } } 选项2(注意class关键字): class-SomeUtil{ //对象状态(属性) 功能(编号:长){ // ... } } @模块 类AppModule{ @提供 @独生子女 内部fun

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

选项1(注意
对象
关键字):

objectsomeutil{
//对象状态(属性)
功能(编号:长){
// ...
}
}
选项2(注意
class
关键字):

class-SomeUtil{
//对象状态(属性)
功能(编号:长){
// ...
}
}
@模块
类AppModule{
@提供
@独生子女
内部fun provideTheUtil()=SomeUtil()
}
class MainActivity:BaseActivity(){
@注入内部lateinit var util:SomeUtil
}
更新2019-07-03


@Blackbelt在评论中说,在可测试性方面,我们更倾向于选择2。但是像mock这样的库也可以。那么您是否仍然认为选项2是首选选项?

您可能需要重新考虑作为单身汉的
NumberFormatUtil
的需要。如果您将
@reusabled
与Dagger一起使用,甚至直接使用没有任何范围的工厂,可能会更便宜

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

package xyz

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

fun Long.format() = formatNumber(this)

您应该使用选项2

在软件工程中,单例模式是一种软件设计 模式,该模式将类的实例化限制为一个“单个” 例如。这在只需要一个对象时非常有用 协调整个系统的行动

发件人:

因此,单例是作用域中的单个实例。对于Android,它是运行应用程序的虚拟机实例。如果需要自定义作用域,则只能使用选项2

但是,如果在对象中只有静态方法,那么最好将它们作为全局方法保留,甚至去掉
object
。不需要注射任何东西。它类似于只使用静态方法的java类(我提到这一点,因为这是创建实用程序类的常用方法)


但是,如果
对象
也有一些状态。我建议你走匕首之路。
对象
方式不提供依赖项注入。它只创建一个单例。您使用dagger的目的是依赖项注入。

我不知道的这种情况,可测试性?您创建这个包装器“util”类的唯一真正原因是为了测试,否则它的抽象是毫无意义的。@MarkKeen我更新了这个问题来概括它。