匕首单身vs科特林物件

时间:2019-05-23 13:55:12

标签: android kotlin dependency-injection singleton dagger-2

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

选项1:

object NumberFormatUtil {

    fun formatNumber(number: Long) = NumberFormat.getNumberInstance().format(number)

    fun formatPercent(fraction: Double) = NumberFormat.getPercentInstance().format(fraction)
}

选项2:

class NumberFormatUtil {

    fun formatNumber(number: Long) = NumberFormat.getNumberInstance().format(number)

    fun formatPercent(fraction: Double) = NumberFormat.getPercentInstance().format(fraction)
}
@Module
class SomeModule {

    @Provides
    @Singleton
    internal fun provideNumberFormat() = NumberFormatUtil()
}
class SomeActivity : BaseActivity() {

    @Inject internal lateinit var numberFormat: NumberFormatUtil
}

3 个答案:

答案 0 :(得分:2)

您可能想重新考虑NumberFormatUtil是单身人士的需要。如果将@Reusable Dagger 一起使用,甚至是没有任何作用域的工厂,则可能会更便宜。

如果NumberFormatUtil非常简单,仅提供了一些实用程序方法,没有状态,也不需要在测试中进行模拟,则可以使用object实现,也许将@JvmStatic用于< em> Java -互操作性。但随后您也可以使用全局实用程序(扩展)功能:

package xyz

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

fun Long.format() = formatNumber(this)

答案 1 :(得分:0)

您可以完美地进行依赖注入,而无需使用匕首。为此有很多框架,但是您甚至可以在没有框架的情况下手动完成所有操作。您可以(我已经做到了)使用DI技术完美编写应用程序,甚至不需要使用框架。

在kotlin中,您可以完美地创建一个Utils.kt文件,并在其中插入一些函数,并且这些函数将随处可见(还将创建一个单例)。

我的建议:保持简单。

如果您可以使用纯Kotlin做到这一点,并且不会给您的应用程序增加额外的复杂性,请这样做。如果它会使您的代码库模糊不清或使您的代码混乱(或者您将混合使用各种方法和方法使以后的编码人员感到困惑),那就不要。

额外: 对于需要直接控制图形的对象等,有很多框架可供选择。 (尝试Koin,真的很简单,是Kotlin的朋友),如果您的应用程序确实很复杂,则可以使用Dagger或其中一些。但是,如果您可以不使用DI框架而自己做所有事情,这将是更好的选择。

我知道并不是每个人都会同意这种观点,但是根据我的经验,事实就是这样。

答案 2 :(得分:0)

您应该使用选项2。

  

在软件工程中,单例模式是软件设计   模式,将类的实例限制为一个“单个”   实例。当仅需要一个对象来执行此操作时很有用   协调整个系统中的动作。

发件人:Singleton Pattern

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

但是,如果对象中只有静态方法,则希望更好地注入该对象,以使其保持全局方法,甚至摆脱object。无需注入任何东西。它类似于仅具有静态方法的Java类(我提到这一点是因为它是创建Utility类的常用方法)。

但是,如果object也具有某种状态。我建议用匕首的方式。 object方法不提供依赖项注入。它仅创建一个Singleton。使用匕首的目的是依赖注入。