Властивість має бути ініціалізована або бути абстрактною


121

Це, мабуть, дурне питання, але я справді новачок у Котліна і не знайшов жодного рішення.

Як оголосити поле класу? Наче ми можемо це мати в Java:

protected SharedPreferences mSharedPreferences;

А згодом у onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Тепер я можу використовувати його де завгодно (у підкласах цієї базової діяльності).

Я намагаюся зробити те ж саме в Котліні:

protected var sharedPreferences : SharedPreferences

І в onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Але я отримую попередження: "Властивість має бути ініціалізована або бути абстрактною"

Відповіді:


188

Якщо ви хочете ініціалізувати властивість поза конструктором, ви можете шукати властивості , які пізно ініціалізуються . Заявіть про властивість за допомогою lateinitмодифікатора, який дозволить пропустити інакше необхідний ініціалізатор і зробить доступ до властивості за винятком за винятком, поки йому не буде призначено якесь значуще значення:

protected lateinit var sharedPreferences: SharedPreferences

12
Я спробував використовувати "захищений var sharedPreferences: SharedPreferences? = Null", і він також працює, в чому різниця?
Антон Шкуренко

Я бачу, що якщо я використовую Dagger2 для DI, я повинен використовувати ваш варіант, правда?
Антон Шкуренко

30
Різниця полягає в тому, що ви можете оголосити нерегульовані значення за допомогою lateinit.
Кирило Рахман

16

Витягуючи це з коментарів з відповіді Олександра Удалова для наочності. Для мінливих властивостей:

protected var sharedPreferences : SharedPreferences? = null

... і присвоїти йому значення пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.