속성은 초기화되거나 추상이어야합니다.


121

어리석은 질문 이겠지만 저는 Kotlin을 처음 접했고 해결책을 찾지 못했습니다.

클래스 필드를 선언하는 방법은 무엇입니까? 자바에서 가질 수있는 것처럼 :

protected SharedPreferences mSharedPreferences;

그리고 나중에 onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

이제 원하는 모든 곳에서 사용할 수 있습니다 (이 기본 활동의 하위 클래스에서).

Kotlin에서도 동일하게 시도합니다.

protected var sharedPreferences : SharedPreferences

그리고 onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

하지만 경고가 표시됩니다. "속성은 초기화되거나 추상이어야합니다."

답변:


187

생성자 외부에서 속성을 초기화하려는 경우 나중에 초기화 된 속성을 찾을 수 있습니다. lateinit수정자를 사용 하여 속성을 선언하면 필요한 초기화 프로그램을 건너 뛸 수 있고 의미있는 값이 할당 될 때까지 예외와 함께 속성 액세스가 실패하게됩니다.

protected lateinit var sharedPreferences: SharedPreferences

12
"protected var sharedPreferences : SharedPreferences? = null"을 사용하려고 했는데도 작동합니다. 차이점은 무엇입니까?
Anton Shkurenko 2015

DI를 위해 Dagger2를 사용한다면 당신의 변형을 사용해야합니다.
Anton Shkurenko 2015

30
차이점은 lateinit를 사용하여 nullable이 아닌 값을 선언 할 수 있다는 것입니다.
Kirill Rakhman 2015

15

가시성에 대한 Alexander Udalov의 답변에서 이것을 꺼내십시오. nullable 속성의 경우 :

protected var sharedPreferences : SharedPreferences? = null

... 나중에 값을 할당합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.