2016-01-08 33 views
2

我想確定自己訪問的領域,像這樣:我們可以定義我們的訪問器沒有init值嗎?

var item: Item 
    get() {...} 
    set(value) {...} 

我得到一個錯誤,因爲項目未初始化。我不能添加lateinit,因爲我定義了get和set方法。

我可以選擇是聲明另一個可空場,並使用該字段來實現該項目的存取,這是太愚蠢和冗餘。

所以我想一定有其他的方式來實現這一要求......


更新:

感謝您的答覆。 我想我沒有清楚地表達出來。當我多次閱讀文檔後,我認爲答案是否定的。

我的要求是:是否有更簡單的替代方法來聲明這一點?

private var _table: Map<String, Int>? = null 
public val table: Map<String, Int> 
    get() { 
     if (_table == null) 
     _table = HashMap() // Type parameters are inferred 
     return _table ?: throw AssertionError("Set to null by another thread") 
    } 

我們必須聲明nullabe後盾屬性,以便我們可以自定義訪問器,也離開了現場初始化。

回答

4

如果您聲明具有支持字段的屬性,則需要對其進行初始化。如果你不想初始化它,你可以聲明自定義的getter和setter。

var item: String 
    get() = "my String" 
    set(value) { 
     log(value) 
     //do something with value 
    } 

如果你沒有一個值來初始化屬性,聲明它爲空的,並與null

var item: String? = null 
    get() = field 
    set(value) { 
     field = value 
     //do something with value 
    } 

初始化它如果這不符合您的要求,請更新問題澄清。

相關問題