通常情况下,我会得到一个代码为A的示例。
代码B来自article。
在class UIApp
中启动override func onCreate(){... }
之前,UIApp.instance
可能会导致错误。
我不知道UIApp.instance
能不能拿到示例,你能告诉我吗?
代码A
class Billing private constructor (
private val mContext: Context,
private val purchaseItem :String
) {
companion object {
@Volatile
private var INSTANCE: Billing? = null
fun getInstance(mContext: Context, purchaseItem: String): Billing =
INSTANCE ?: synchronized(this) {
INSTANCE ?: Billing(mContext, purchaseItem).also { INSTANCE = it }
}
}
}
val my = Billing.getInstance(mContext,purchaseItem)
代码B
@HiltAndroidApp
class UIApp : Application() {
companion object{
@JvmStatic
lateinit var instance: UIApp
}
override func onCreate(){
instance = this
}
}
@InstallIn(SingletonComponent::class)
@Module
object ObjectModule {
@Provides
@Singleton
fun provideUIApp(): UIApp {
return UIApp.instance
}
}
1条答案
按热度按时间tez616oj1#
代码B起作用是因为Application类的
onCreate()
函数是应用进程的第一个入口点。只要您没有使用init
块或UIApp类的属性初始化器来这样做,就不可能在instance
属性被分配之前访问它。由于它是在onCreate()
中分配的,因此应用中的任何其他线程都没有机会在分配之前启动其他可能访问它的线程。因此,不需要线程同步或将其标记为volatile。不过,你的代码B的设计中似乎有一个可能的缺陷。它强制将
purchaseItem
参数传递给getter函数,但它只在第一次调用该函数时使用该参数,然后所有未来的调用都将获得使用该原始值的示例,即使它们请求不同的值。