2016-01-08 2 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

Если вы объявите свойство с помощью поля поддержки, вам необходимо его инициализировать. Если вы не хотите инициализировать его, вы можете объявить пользовательские геттеры и сеттеры.

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 
    } 

Если это не соответствует вашим требованиям, пожалуйста, обновите вопрос прояснить.

Смежные вопросы