android 我会得到一个示例使用的方式?

6tqwzwtp  于 2023-05-15  发布在  Android
关注(0)|答案(1)|浏览(218)

通常情况下,我会得到一个代码为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
    }
}
tez616oj

tez616oj1#

代码B起作用是因为Application类的onCreate()函数是应用进程的第一个入口点。只要您没有使用init块或UIApp类的属性初始化器来这样做,就不可能在instance属性被分配之前访问它。由于它是在onCreate()中分配的,因此应用中的任何其他线程都没有机会在分配之前启动其他可能访问它的线程。因此,不需要线程同步或将其标记为volatile。
不过,你的代码B的设计中似乎有一个可能的缺陷。它强制将purchaseItem参数传递给getter函数,但它只在第一次调用该函数时使用该参数,然后所有未来的调用都将获得使用该原始值的示例,即使它们请求不同的值。

相关问题