2014-10-20 2 views
1

Рассмотрим следующий класс:Котлин: Как получить доступ к свойствам в конструкторе

class Test() { 
    init { 
     log(foo) 
    } 

    val foo = "Bar" 
} 

Когда я instatiate Проверьте это производит NullPointerException, потому что Foo, кажется, не инициализируются. Действительно ли это поведение предназначено? Есть ли обходной путь?

+0

Обратите внимание, что ток Котлин требует блоков инициализации иметь 'init' ключевого слова перед ними в настоящее время. Этот синтаксис в вопросе устарел. –

+0

Обновлен синтаксис –

ответ

5

Корпус класса выполнен сверху вниз. Если вы хотите что-то, чтобы запустить кусок кода после инициализации свойств, вы должны поместить его ниже:

class Test() { 
    val foo = "Bar" 

    init { 
     log(foo) 
    } 
} 
+0

Андрей, спасибо за ответ. Моя проблема заключалась в том, что компилятор не позволял мне помещать конструктор после делегированного свойства, потому что он думал, что блок является выражением лямбда, переданным в качестве параметра. Я понял, вы можете просто поставить точку с запятой после свойства, чтобы предотвратить это. Отметьте это как правильный ответ. –

+0

Примечание: ';', добавленный @Andrey, не требуется для разделения блока инициализации в текущем Kotlin, вместо этого вы добавляете ключевое слово 'init' перед блоком. Этот ответ должен быть обновлен до текущего Котлина. –

+0

Обновлен синтаксис –

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