问题标签 [kotlin-lateinit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何从 Java 中隐藏 Kotlin 的 lateinit var 支持字段?
假设在 Kotlin 中,我有课:
根据文档:
Late-Initialized 属性也作为字段公开。该字段的可见性将与 lateinit 属性设置器的可见性相同。
我可以在java代码中使用myKotlinClass.field
或myKotlinClass.getField()
. 我想禁用字段访问并仅通过getter和setter访问。
我怎样才能做到这一点并保持lateinit修饰符?
database - 启动时具有参数化初始化的单例数据库对象?
我正在尝试创建一个可供多个类使用的单个数据库实例(object
在 Kotlin 中使用关键字)。但是,我希望能够在创建单例实例之前指定数据库名称。
由于无法使用参数初始化单例对象,我想知道我正在做的事情是否有效,或者是否有更好的做事方式:
在另一个文件中
基本上,我在单例对象中封装了一个“数据库容器”,方法是对数据库容器使用延迟初始化,并提供用于指定数据库名称的 lateinit 变量,并在单例对象中使用初始化函数来初始化数据库容器。这样一来,当我第一次启动应用程序时,在我的 main 方法中,我可以从一些本地属性文件中加载数据库名称并调用val database = DatabaseSingleton.init("DATABASE_NAME", client)
以创建需要由多个其他类访问的数据库单例。
这是做我想做的事的好方法,还是有更好的做事方法?
android - 如何在 Kotlin 中注入原始变量?
我在我的 Android 应用程序中将 Dagger2 用于 DI,并且使用此代码将类注入到我的 Activity 中很好:
但是,lateinit
Kotlin 中的原始类型属性不允许使用修饰符(例如Boolean
),我该怎么做这样的事情?
lateinit
当我从此代码中删除时,我收到此错误Dagger does not support injection into private fields
field - Kotlin - How to make field read-only for external classes
I have the following Kotlin class on Android:
Now, any external class can get the INetwork reference by simply doing:
However, that also makes it possible for an external class to overwrite that value:
I want to avoid the second option. Unfortunately, I can't make the field val
because its initialization needs to happen inside the onCreate
callback.
I also thought about making the field private and exposing it through a function, like this:
However, whoever calls getNetwork() can still assign a new value to it, like so:
How can I make the network field to be read-only by external classes? Or even better, is there a way to make it val
even though I can't initialize it inside a constructor?
spring - 带有 Spring DI 的 Kotlin:lateinit 属性尚未初始化
我没有在 Kotlin 中获得基于 Spring 的 setter 依赖注入工作,因为它总是以错误消息“lateinit property api has not been initialized”终止。我可以将问题简化为以下场景:有一个接口
这是由
我想在另一个应该发生依赖注入的类中使用实现:
但是,应用程序终止并显示上述错误消息。我的 Spring 配置如下所示:
在主函数中,我加载应用程序上下文并调用方法:
这里有什么问题?
java - kotlin 中的 lateinit、惰性和单例模式
我正在尝试将我的项目的某些部分java
从kotlin
. 其中之一是单例管理器类。java类看起来像这样
另外,我将.kt 反编译回java。在伴随类中,我得到以下代码。
}
1) 如何通过在 kotlin 伴随对象中使用 lateinit 或lazy 来实现线程安全、单例?如我所见,反编译的 java 代码在初始化函数中有一个同步调用,但在同步主体中没有任何内容。
2)我认为 kotlin object/lazy 带有线程安全保证,我如何在双重检查锁定模式中利用它?
3)有比双重检查锁定模式更好的模式吗?假设构造函数确实需要参数。
4)由于我试图使将此管理器类转换为 kotlin 文件的影响尽可能小(此管理器文件应该与其余的 java 代码一起使用),最好的方法是什么?我确实注意到我必须在伴随对象内添加@Jvmstatic
或添加@Jvmfield
一些其他变量或函数,这样我就不必更新在管理器中调用这些静态字段的其他 java 文件。
5)另外的问题,如果这个管理器现在在纯 kotlin 环境中工作,实现具有多个参数的单例类的最佳实践是什么?
android - 如何使用自定义类对象正确实现 lateinit 以在 android 中的 onCreate() 中使用避免“预期的属性获取器或设置器”错误
我正在尝试使用 Kotlin 将 Dialogflow(以前的 api.ai)代理与我的 Android 应用程序集成。我查看了关于 kotlin 的其他问答lateinit
,Android 中的 onCreate() 生命周期非常适合后期初始化实现,以避免在 Kotlin 中使用空对象和相应!!
的访问编写脏代码。?
但是我在尝试自定义类的实例时遇到了“ Property getter or setter expected ”的错误。lateinint
这是代码:
这给了我“预期的属性获取器或设置器”的错误lateinit settingsManager
。这是SettingsManager
定义:
那么这样做的正确方法是什么?我需要对 SettingsManager 类进行一些更改吗?请清楚地解释整个概念。
java - isInitialized - lateinit var 的支持字段此时不可访问
我正在尝试检查lateinit
属性是否已初始化。
在 Kotlin 1.2 中,我们现在有了这样的isInitialized
方法。当我在声明了 lateinit 属性的类中这样做时,它会起作用。但是当我尝试从另一个类中调用它时,我收到以下警告:
'lateinit var foo: Bar' 的支持字段此时不可访问
我的模型类(比方说Person
)是用 Java 编写的
另外两个类(比方说Test1
和Test2
)是用 Kotlin 编写的
例子:
-
有机会让这个工作吗?
我目前的解决方法是在 Test1 中创建一个isInitialized
从person
属性返回的方法。
kotlin - 在初始化 lateinit var 时通知 (Kotlin)
这是一个直截了当的问题,但我找不到答案。lateinit var
在 Kotlin 中初始化a 时有没有办法得到通知?
我知道我可以检查它是否已被初始化,this::coolvar.isInitialized
但这不一样。
谢谢
android - 无法从 Kotlin 1.2.10 解析 lateinitVar 以使用 isInitialized
我想使用这个功能
示例中最简单的方法对我不起作用:
但我越来越
我在 Android-Studio 中通过 gradle 使用 Kotlin 1.2.10(也安装了 Kotlin 1.2.10 插件)