Tag: kotlin lateinit

在启动时使用参数化初始化的单例数据库对象?

我试图创建一个可以被多个类使用的单个数据库实例(在Kotlin中使用object关键字)。 但是,我希望能够在创建单例实例之前指定数据库名称。 由于单例对象不能用参数初始化,所以我想知道我在做什么是有效的,或者是否有更好的方法来做事情: object DatabaseSingleton { private lateinit var databaseName: String private lateinit var mongoClient: MongoClient val database: DatabaseContainer by lazy { DatabaseContainer(databaseName, mongoClient) } fun init(databaseName: String, mongoClient: MongoClient): DatabaseSingleton { this.databaseName = databaseName this.mongoClient = mongoClient return this } } 并在另一个文件 class DatabaseContainer(databaseName: String, val mongoClient: MongoClient) { val db: MongoDatabase = mongoClient.getDatabase(databaseName) […]

关键字lateinit是不必要的?

我正在学习Kotlin的过程中,阅读关于lateinit关键字使我怀疑它的用处。 考虑这个代码: var testString: String? = null lateinit var lateTestString: String fun print() { print(testString?.length) print(lateTestString.length) } 这里得到字符串长度的唯一区别是通过使用?.来检查它是否为null ?. 运营商。 在访问属性或调用方法时,是否使用lateinit快捷方式不必添加额外的问号? 就这一点而言,我认为在访问lateinit一个问题时,不得不添加额外的问号而不是获得一个exception。 更多的研究表明,对于那些variables尚未初始化的注入和/或unit testing来说, lateinit是很好的选择,但是它是可以的。 然而,这不值得有这个额外的东西?. 而不是仅仅. 不冒险例外?

当重新创建Activity时,lateinit属性不会被初始化

在我的活动我有一个lateinit属性称为controller ,我的片段使用。 该属性在Activity.onCreate()初始化。 我的Fragment通过onAttach()获取其参考。 然后Fragment在Fragment.onCreate()调用myActivity.controller 。 通常controller首先在Activity.onCreate()初始化,然后添加Fragment 。 所以这工作得很好。 但是,当我的Activity被杀害,它试图重新创建自己和它的碎片。 这导致在Activity.onCreate()初始化之前调用Fragment.onCreate() Activity.onCreate() 。 这些是我现在看到的选项: 在super.onCreate()之前初始化controller (如果甚至可能的话) 将调用移动到myActivity.controller到更高的生命周期回调,如onViewCreated() 在Kotlin 1.2中有::controller.isInitialized 这里我最好的选择是什么?

如何使用自定义的类对象在android中的onCreate()中使用正确实现lateinit避免“属性获取或设置器预期”错误

我正在尝试使用Kotlin实现Dialogflow(之前的api.ai)代理与我的Android应用程序的集成。 我检查了关于kotlin lateinit其他问答,Android中的onCreate()生命周期是晚期init实现的理想选择,以避免用空对象编写脏代码和相应的!! 和? 访问Kotlin。 但是在尝试lateinint自定义类的实例时,我lateinint了“ Property getter or setter expected ”的错误。 这里是代码: class AIApplication : Application() { private var activitiesCount: Int = 0 var lateinit settingsManager: SettingsManager //private set private val isInForeground: Boolean get() = activitiesCount > 0 override fun onCreate() { super.onCreate() settingsManager = SettingsManager(this) } 这给了我在lateinit settingsManager行的’ Property getter或setter expected ‘的lateinit settingsManager […]

isInitialized – lateinit var的备份字段在此处不可访问

我试图检查一个lateinit属性是否已经初始化。 在Kotlin 1.2中,我们现在有了isInitialized方法。 当我在声明了lateinit属性的类中这样做的时候,它就起作用了。 但是,当我尝试从另一个class级调用这个时,我收到以下警告: 此处不能访问’lateinit var foo:Bar’的备份字段 我的模型类(比方说Person )是用Java编写的 另外两个类(比如说Test1和Test2 )是用Kotlin编写的 例: class Test1 { lateinit var person: Person fun method() { if (::person.isInitialized) { // This works } } } – class Test2 { lateinit var test1: Test1 fun method() { if (test1::person.isInitialized) { // Error } } } 有机会得到这个工作? 我目前的解决方法是在Test1中创建一个从person属性返回isInitialized的方法。 fun isPersonInitialized(): […]

Kotlin:val,或者可以设置一次的var

只是好奇:在Kotlin,我很想得到一些可以被懒惰初始化的val,但是有一个参数。 那是因为我需要一些很晚才创建的东西来初始化它。 具体来说,我希望我有: private lateinit val controlObj:SomeView 要么: private val controlObj:SomeView by lazy { view:View->view.findViewById(…)} 接着: override fun onCreateView(….) { val view = inflate(….) controlObj = view.findViewById(…) 或者在controlObj.initWith(view)情况下controlObj.initWith(view)或类似的东西: return view 我不能by lazy使用by lazy因为by lazy不会接受初始化时要使用的外部参数。 在这个例子中 – 包含的view 。 当然,我有lateinit var但如果我能确保它只是在设置后才能读取,我可以在一行中完成。 是否有一个非常干净的方法来创建一个只读的variables,只初始化一次,但只有当其他一些variables出生? 任何init once关键字? 在init之后,编译器知道它是不可变的? 我意识到潜在的并发问题,但如果我敢于在init之前访问它,我当然应该被抛出 。

Kotlin – 如何使外部类只读字段

我在Android上有以下Kotlin类: class ThisApplication: Application() { lateinit var network: INetwork override fun onCreate() { super.onCreate() network = Network() } } 现在,任何外部类都可以通过简单的操作来获得INetwork引用: application.network 但是,这也使得外部类可以覆盖该值: application.network = myNewNetworkReference 我想避免第二个选项。 不幸的是,我不能使字段val因为它的初始化需要在onCreate回调内发生。 我也考虑过把这个领域变成私有的,并通过一个函数来暴露它,像这样: private lateinit var network: INetwork fun getNetwork() = network 但是,调用getNetwork()的人仍然可以为它分配一个新的值,如下所示: application.getNetwork() = myNewNetworkReference 我怎样才能使网络领域只读的外部类? 或者甚至更好,是否有一种方法来使其val即使我不能在构造函数中初始化它?

当lateinit var被初始化时通知(Kotlin)

这是一个简单的问题,但我找不到答案。 有没有办法在Kotlin初始化一个lateinit var时被通知? 我知道我可以检查它是否已经被初始化为this::coolvar.isInitialized但这是不一样的。 谢谢

lateinitVar无法解析使用从Kotlin 1.2.10 isInitialized

我想使用这个function 像这个例子中最简单的东西不适合我: lateinit val foo = 1 val bar = foo::lateinitVar.isInitialized() 但是我越来越 unresolved reference lateinitVar 我在Android-Studio中通过Gradle使用Kotlin 1.2.10(也安装了Kotlin 1.2.10插件)

Kotlin – 如何使外部类只读字段

我在Android上有以下Kotlin类: class ThisApplication: Application() { lateinit var network: INetwork override fun onCreate() { super.onCreate() network = Network() } } 现在,任何外部类都可以通过简单的操作来获得INetwork引用: application.network 但是,这也使得外部类可以覆盖该值: application.network = myNewNetworkReference 我想避免第二个选项。 不幸的是,我不能使字段val因为它的初始化需要在onCreate回调内发生。 我也考虑过把这个领域变成私有的,并通过一个函数来暴露它,像这样: private lateinit var network: INetwork fun getNetwork() = network 但是,调用getNetwork()的人仍然可以为它分配一个新的值,如下所示: application.getNetwork() = myNewNetworkReference 我怎样才能使网络领域只读的外部类? 或者甚至更好,是否有一种方法来使其val即使我不能在构造函数中初始化它?