2017-07-24 50 views
2

Kotlin語言中是否有任何類型可用於後期初始化而不是java.lang.Integer以便我不會收到編譯器警告?在Kotlin項目中使用@Value註釋時的編譯器警告

比方說,我有這樣一個類:

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

我無法從科特林使用Int類型,因爲它的基本類型和lazeint不接受它。

如果我堅持java.lang.Integer它工作得很好,但我得到這種編譯器警告:

SomeClass.kt:(20,24):此類不應該在科特林使用。改爲使用 kotlin.Int。

很明顯,我可能會自己創建需要的類型,但我只是想知道是否有一些開箱即用,並建議我們應該在這種情況下使用,而我根本找不到它? (註釋的構造函數在這種情況下不是解決方案)。

+2

爲什麼不簡單地將它設置爲-1或Int.MinValue來標記它沒有被初始化? 另一種選擇是使用BigInteger(但可能會對性能產生影響) –

+0

@ LiorBar-On我想我已經過時了這個:)簡單是一個國王! –

回答

4

最簡單的解決方案是不要使用遲後初始化的屬性,因爲Kotlin後期初始化的屬性現在不支持原始類型,並且可以使用默認的spring表達式初始化它,例如:

@Value(#{config['poolCapacity']?:'5000'}) 
var somePool: Int = 5000 

一個複雜的例子,你可以寫一個委託屬性,但你必須@set站點的目標,而不是field/propertysetter註釋,例如:

@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; 
     } 

    } 
} 
+0

我承認這可行,但我不完全確定這是否是唯一可行的解​​決方案。 如果你不介意,我會再給它幾天。如果沒有人提出更好的建議,我會接受它作爲答案。 –

+0

@MateuszChrzaszcz嗨,請看我編輯的答案。 –

+0

是的,當你不能簡單地默認它時,它更像是在一個更復雜的情況下! –