要定义单例,应该使用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
}
答案 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。
在软件工程中,单例模式是软件设计 模式,将类的实例限制为一个“单个” 实例。当仅需要一个对象来执行此操作时很有用 协调整个系统中的动作。
因此,单例是作用域中的单个实例。如果是Android,则是运行该应用程序的虚拟机实例。如果需要自定义范围,则只需使用选项2。
但是,如果对象中只有静态方法,则希望更好地注入该对象,以使其保持全局方法,甚至摆脱object
。无需注入任何东西。它类似于仅具有静态方法的Java类(我提到这一点是因为它是创建Utility类的常用方法)。
但是,如果object
也具有某种状态。我建议用匕首的方式。 object
方法不提供依赖项注入。它仅创建一个Singleton。使用匕首的目的是依赖注入。