代码A来自项目play-billing-samples
,您可以看到它。
我不知道作者为什么将localcachebillingclient
设计为lateinit
,这是因为代码不太复杂,如果(::localcachebillingclient.isinitializal==false){...}
被多次调用。
我认为代码B可以很好地工作,对吗?
class BillingRepository private constructor(private val application: Application) :
PurchasesUpdatedListener, BillingClientStateListener {
lateinit private var localCacheBillingClient: LocalBillingDb
val subsSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
if (::localCacheBillingClient.isInitialized == false) {
localCacheBillingClient = LocalBillingDb.getInstance(application)
}
localCacheBillingClient.skuDetailsDao().getSubscriptionSkuDetails()
}
val inappSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
if (::localCacheBillingClient.isInitialized == false) {
localCacheBillingClient = LocalBillingDb.getInstance(application)
}
localCacheBillingClient.skuDetailsDao().getInappSkuDetails()
}
fun startDataSourceConnections() {
Log.d(LOG_TAG, "startDataSourceConnections")
instantiateAndConnectToPlayBillingService()
localCacheBillingClient = LocalBillingDb.getInstance(application)
}
...
}
代码B
class BillingRepository private constructor(private val application: Application) :
PurchasesUpdatedListener, BillingClientStateListener {
private val localCacheBillingClient: LocalBillingDb by lazy {
LocalBillingDb.getInstance(application)
}
val subsSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
localCacheBillingClient.skuDetailsDao().getSubscriptionSkuDetails()
}
val inappSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
localCacheBillingClient.skuDetailsDao().getInappSkuDetails()
}
fun startDataSourceConnections() {
Log.d(LOG_TAG, "startDataSourceConnections")
instantiateAndConnectToPlayBillingService()
}
...
}
Kotlin-使用“by lazy”与“lateinit”进行属性初始化
我相信答案就在这条线上,就在这一点下面。
lateinit var可以从任何可以看到对象的地方初始化,例如从框架代码内部初始化,对于单个类的不同对象可以使用多种初始化方案。by lazy{...}反过来为该属性定义唯一的初始值设定项,只能通过在子类中重写该属性来更改该初始值设定项。如果希望从外部以事先可能未知的方式初始化属性,请使用LateInit。
问题内容: 我遇到过,我不确定它到底在做什么。 例如: 作者为什么要在块关闭连接和垃圾收集器处理时输入? 问题答案: 真正归结为成为“好公民”(并且真正了解接口契约)。什么会做的是释放被持有的所有资源,这实质上意味着释放任何基础流,并给予Connection对象返回到其池(在的情况下你的连接管理器是一个多线程的一个)或释放连接管理器,以便它可以处理下一个要求。 如果您不使用,则实际发生的情况取决于
GIL(global interpreter lock),全局解释器锁,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发。它也是 Python 中经常讨论的话题之一。 Python 作为编程语言存在多个具体实现,包括最常用的 CPython、超集 Cython、.NET 平台的 IronPython、JVM 上的 Jython,R 语言实现的 RPython、JIT 版本的
问题内容: Java的软件包管理系统对我而言似乎总是简单而有效的。JDK本身大量使用它。我们一直在使用它来模仿名称空间和模块的概念。 什么是 Jigsaw项目 (又名Java平台模块系统)试图填补? 从官方网站: 该项目的目标是为Java SE平台设计和实现标准模块系统,并将该系统应用于平台本身和JDK。 问题答案: Jigsaw和OSGi试图解决相同的问题:如何在保护内部组件的同时允许粗粒度模块
我刚刚安装了Ubuntu desktop 12.04并通过以下方式安装了Java 6 JDK: 但是当我转到时,我没有看到一个名为的目录,所以我认为它根本不存在!?! 当我转到时,我看到: 我现在正试图将作为环境变量添加到中,以便从基于shell的Ant构建中访问它: ? ? 还有别的吗? 我所说的“”是指我在系统上安装的JDK6的顶级目录,无论它在哪里······
问题内容: 。 为什么将Double.parseDouble制作为?例如 : IS印刷 相反,它必须显示或 任何帮助都将不胜感激。 问题答案: 仅具有15/16位数的精度,当您给它提供一个数字时,它就无法表示(多数情况下,甚至0.1都不是精度),它将采用最接近的可表示数字。 如果要精确表示,则需要使用BigDecimal。 版画 现实世界中很少有问题需要这种准确性,因为您无论如何都无法准确地进行测
问题内容: 我正在使用最后一个selenium,一些网站随机弹出消息,停止正常的测试过程 我在想的是,我需要做IAlert as Observer模式,以捕获警报并接受它,并从其停止处理弹出窗口的点继续进行测试。 IAlert代码: 主要问题是如何执行它,或者是否有更好的方法来处理随机弹出窗口? 谢谢 问题答案: 由于在尝试执行其他操作时弹出窗口很重要,因此我建议采用以下方法:EventFirin