在Kotlin项目中使用@Value注解时编译器出现警告

4

在Kotlin语言中,是否有任何类型可以用于延迟初始化,而不是使用java.lang.Integer,以避免编译器发出警告?

假设我有一个像下面这样的类:

class SomeClass {
 @Value(#{config['poolCapacity']?:'5000'})
 lateinit var somePool: Integer
}

由于 Int 类型是基本类型,因此无法在 Kotlin 中使用,而且 lazeint 不接受它。

如果我坚持使用 java.lang.Integer,那么它就可以正常工作,但是我会收到这样的编译器警告:

SomeClass.kt: (20, 24): 此类不应在 Kotlin 中使用。请使用 kotlin.Int 代替。

很明显,我可以自己创建所需的类型,但是我想知道是否有推荐的开箱即用解决方案可供使用?(在这种特定情况下,注释构造函数不是解决方法)。


2
为什么不直接将其设置为-1或Int.MinValue来标记它未被初始化呢?另一个选择是使用BigInteger(但可能会对规模产生性能影响)。 - Lior Bar-On
@LiorBar-On 我猜我对这个问题想得太多了 :) 简单才是王道! - Mateusz Chrzaszcz
1个回答

4
最简单的解决方案是不要使用延迟初始化属性,因为Kotlin延迟初始化属性目前不支持原始类型,你可以使用Spring表达式的默认值进行初始化,例如:
@Value(#{config['poolCapacity']?:'5000'})
var somePool: Int = 5000

您可以编写委托属性的复杂示例,但必须使用@set站点目标注释setter,而不是field/property。例如:

@set:Value(#{config['poolCapacity']?:'5000'})
var value by required<Int>()

inline fun <reified T> required(): ReadWriteProperty<Any, T> {
    return object : ReadWriteProperty<Any, T> {
        var value: T? = null;
        override fun getValue(thisRef: Any, property: KProperty<*>): T = value as T

        override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
            this.value = value;
        }

    }
}

我承认这个方法可以行得通,但我并不完全确定这是唯一可行的解决方案。 如果您不介意的话,我想再给它几天时间。如果没有人提出更好的建议,我会接受它作为答案。 - Mateusz Chrzaszcz
是的,在更复杂的情况下,当您无法简单地使用默认值时,就像这样! - Mateusz Chrzaszcz
2
@MateuszChrzaszcz 是的,先生。我很高兴它能帮助到您。但我认为您从来不需要这些复杂的特性,因为如果找不到值,Spring 将抛出一个无法初始化的 bean 异常。只使用最简单的解决方案就可以了。 - holi-java

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,