【问题标题】:'lateinit' modifier is not allowed on properties of primitive types - Kotlin原始类型的属性不允许使用“lateinit”修饰符 - Kotlin
【发布时间】:2019-05-11 14:59:09
【问题描述】:

我在尝试将环境变量值分配给 lateinit 变量时遇到错误。 错误是“原始类型的属性不允许使用'lateinit'修饰符”

我的application.properties(读取环境变量)

my.property.from.properties.file=true

MyService 类:

@Component
class MyService @Autowired constructor(
    private val someService: SomeService) {

    @Value("\${my.property.from.properties.file}")
    private lateinit var myBooleanEnabled: Boolean

为其赋值并不能解决问题。例如,用

private lateinit var myBooleanEnabled: Boolean = true

我收到 2 个错误:

  • 原始类型的属性不允许使用“lateinit”修饰符
  • 'lateinit' 修饰符不允许用于带有初始化程序的属性

对于我阅读的内容,我需要一个委托 (https://kotlinlang.org/docs/reference/delegated-properties.html),但我无法完全掌握它。此外,如果有“更清洁”的解决方案,我不想编写另一种方法来设置属性。 有什么想法吗?

【问题讨论】:

  • 如果可以初始化变量,只需去掉lateinit修饰符即可。
  • 如果您想知道为什么会这样:Why doesn't Kotlin allow to use lateinit with primitive types?... 那么如果该变量从未初始化,那么该变量的默认值应该是什么?如果是false,则使用:private var myBooleanEnabled : Boolean = false并将其设置为系统属性,如果存在....问题解决了吗?

标签: spring kotlin properties-file


【解决方案1】:

您可以使用构造函数注入,如下所示。如果您使用的是 Spring 4.3+,则不需要 @Autowired 注释。 Spring 文档对此有一些指导:

https://docs.spring.io/spring/docs/current/spring-framework-reference/languages.html#injecting-dependencies

@Component
class MyService(
    private val someService: SomeService,
    @Value("\${my.property.from.properties.file}")
    private val myBooleanEnabled: Boolean)

【讨论】:

    【解决方案2】:

    最简单的方法是将myBooleanEnabled定义为可空并删除lateinit

    private var myBooleanEnabled: Boolean? = null
    

    在这种情况下,它不会被解释为字节码中的原始boolean

    但是,在您的情况下,我建议使用构造函数注入。

    【讨论】:

    • 但这里需要lateinit
    • 值将来自容器环境变量
    • 那为什么一定要lateinit呢?您仍然可以从容器变量中分配它,同时提供一个默认值作为普通初始化程序。
    • @yole 使用无效值初始化不是一个好主意。如果一些开发人员忘记在属性中设置一些值,或者生产系统没有正确的配置怎么办?完全没有赋值会更好,因为系统会很快失败,而不是有无效的默认值和奇怪的行为。
    • @yole,是的,编译或启动时快速失败是不可能的。但是,在我的示例中,“快速失败”是指“访问值时失败”,因此它当然不如编译或启动失败那么快,但仍然比具有无效值更快更好,并且可能在没有值的情况下对系统造成损害看到任何错误(或在完全不同的地方出现一些非常混乱的错误)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2019-03-31
    • 2020-04-14
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多