Есть ли какой-либо тип языка 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.Int.
Очевидно, я мог бы создать необходимый тип сам, но я просто задаюсь вопросом, есть ли что-то из коробки, и рекомендовал, чтобы мы использовали в такой ситуации, и я просто не могу его найти? (Аннотированный конструктор не является решением в данном конкретном случае).
Самое простое решение – не использовать свойство late initial initialized, поскольку последнее свойство инициализации Kotlin теперь не поддерживает примитивные типы, и вы можете инициализировать его значением по умолчанию весеннего выражения, например:
@Value(#{config['poolCapacity']?:'5000'}) var somePool: Int = 5000
В сложном примере вы можете написать делегированные свойства, но вы должны аннотироваться в setter
по @set
site-target, а не по 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; } } }